diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/api/0.11/annotated.html b/api/0.11/annotated.html new file mode 100644 index 000000000..d5ed74401 --- /dev/null +++ b/api/0.11/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+ + + +
 Cxcm_addr_host
 Cxcm_addr_ip
+
+
+ + + + diff --git a/api/0.11/bc_s.png b/api/0.11/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.11/bc_s.png differ diff --git a/api/0.11/bc_sd.png b/api/0.11/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.11/bc_sd.png differ diff --git a/api/0.11/classes.html b/api/0.11/classes.html new file mode 100644 index 000000000..edf07ff29 --- /dev/null +++ b/api/0.11/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Data Structure Index
+
+
+
X
+
+
+
X
+
xcm_addr_host
xcm_addr_ip
+
+
+ + + + diff --git a/api/0.11/closed.png b/api/0.11/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.11/closed.png differ diff --git a/api/0.11/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.11/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..ecb3887fc --- /dev/null +++ b/api/0.11/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
include Directory Reference
+
+
+ + + + + + + + + + + + + + +

+Files

 xcm.h
 This file contains the core Extensible Connection-oriented Messaging (XCM) API.
 
 xcm_addr.h
 This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
 
 xcm_attr.h
 This file contains the XCM attribute access API. See Socket Attributes for an overview.
 
 xcm_attr_types.h
 This file contains type definitions for the XCM attribute access API.
 
+
+ + + + diff --git a/api/0.11/doc.svg b/api/0.11/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.11/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.11/docd.svg b/api/0.11/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.11/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.11/doxygen.css b/api/0.11/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.11/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.11/doxygen.svg b/api/0.11/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.11/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.11/dynsections.js b/api/0.11/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.11/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.11/files.html b/api/0.11/files.html new file mode 100644 index 000000000..e567c2fd0 --- /dev/null +++ b/api/0.11/files.html @@ -0,0 +1,90 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 12]
+ + + + + +
  include
 xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
 xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
 xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
 xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
+
+
+ + + + diff --git a/api/0.11/folderclosed.svg b/api/0.11/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.11/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.11/folderclosedd.svg b/api/0.11/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.11/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.11/folderopen.svg b/api/0.11/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.11/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.11/folderopend.svg b/api/0.11/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.11/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.11/functions.html b/api/0.11/functions.html new file mode 100644 index 000000000..c9436ea52 --- /dev/null +++ b/api/0.11/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+
+ + + + diff --git a/api/0.11/functions_vars.html b/api/0.11/functions_vars.html new file mode 100644 index 000000000..58279ce9d --- /dev/null +++ b/api/0.11/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the struct/union documentation for each field:
+
+ + + + diff --git a/api/0.11/globals.html b/api/0.11/globals.html new file mode 100644 index 000000000..5346ddb0b --- /dev/null +++ b/api/0.11/globals.html @@ -0,0 +1,128 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- x -

+
+ + + + diff --git a/api/0.11/globals_defs.html b/api/0.11/globals_defs.html new file mode 100644 index 000000000..00edfc0b6 --- /dev/null +++ b/api/0.11/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented macros with links to the documentation:
+
+ + + + diff --git a/api/0.11/globals_enum.html b/api/0.11/globals_enum.html new file mode 100644 index 000000000..e874ca31e --- /dev/null +++ b/api/0.11/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented enums with links to the documentation:
+
+ + + + diff --git a/api/0.11/globals_eval.html b/api/0.11/globals_eval.html new file mode 100644 index 000000000..aa4512119 --- /dev/null +++ b/api/0.11/globals_eval.html @@ -0,0 +1,83 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented enum values with links to the documentation:
+
+ + + + diff --git a/api/0.11/globals_func.html b/api/0.11/globals_func.html new file mode 100644 index 000000000..ecaec13e9 --- /dev/null +++ b/api/0.11/globals_func.html @@ -0,0 +1,108 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the documentation:
+
+ + + + diff --git a/api/0.11/globals_type.html b/api/0.11/globals_type.html new file mode 100644 index 000000000..f764cef1d --- /dev/null +++ b/api/0.11/globals_type.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented typedefs with links to the documentation:
+
+ + + + diff --git a/api/0.11/group__api__version.html b/api/0.11/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.11/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
API Version
+
+
+ + + + + + + + +

+Macros

#define XCM_VERSION_API_MAJOR   0
 
#define XCM_VERSION_API_MINOR   22
 
#define XCM_VERSION_API   "0.22"
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ XCM_VERSION_API_MAJOR

+ +
+
+ + + + +
#define XCM_VERSION_API_MAJOR   0
+
+

The XCM API/ABI major version this library version implements.

+ +
+
+ +

◆ XCM_VERSION_API_MINOR

+ +
+
+ + + + +
#define XCM_VERSION_API_MINOR   22
+
+

The XCM API/ABI minor version this library version implements.

+ +
+
+ +

◆ XCM_VERSION_API

+ +
+
+ + + + +
#define XCM_VERSION_API   "0.22"
+
+

The complete XCM API version in string format.

+ +
+
+
+ + + + diff --git a/api/0.11/group__lib__version.html b/api/0.11/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.11/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Library Version
+
+
+ + + + + + + + + + +

+Macros

#define XCM_VERSION_MAJOR   1
 
#define XCM_VERSION_MINOR   7
 
#define XCM_VERSION_PATCH   0
 
#define XCM_VERSION   "1.7.0"
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ XCM_VERSION_MAJOR

+ +
+
+ + + + +
#define XCM_VERSION_MAJOR   1
+
+

The XCM library major version.

+ +
+
+ +

◆ XCM_VERSION_MINOR

+ +
+
+ + + + +
#define XCM_VERSION_MINOR   7
+
+

The XCM library minor version.

+ +
+
+ +

◆ XCM_VERSION_PATCH

+ +
+
+ + + + +
#define XCM_VERSION_PATCH   0
+
+

The XCM library patch version.

+ +
+
+ +

◆ XCM_VERSION

+ +
+
+ + + + +
#define XCM_VERSION   "1.7.0"
+
+

The complete XCM library version in string format.

+ +
+
+
+ + + + diff --git a/api/0.11/index.html b/api/0.11/index.html new file mode 100644 index 000000000..045d0c2f9 --- /dev/null +++ b/api/0.11/index.html @@ -0,0 +1,416 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
+
+ + + + + + +
+
Extensible Connection-oriented Messaging (XCM) +
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Extensible Connection-oriented Messaging
+
+
+

+Introduction

+

This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

+

XCM consists of of three parts; the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute access API in xcm_attr.h.

+
Author
Mattias Rönnblom
+
Version
0.11
+

+Overview

+

XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow a straight-off mapping to TCP and TLS, but also allow more efficient transport for local communication.

+

XCM reuses much of the terminology (and semantics) of the BSD Sockets API.

+

+Overall Service Semantics

+

XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will have one connection socket for each server it is connected to.

+

Messages are always sent and received on a particular connection socket (and never on a server socket).

+

+Ordering Guarantees

+

In-order delivery - that messages arrive at the receiver in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

+

+Flow Control

+

XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a very large amount of outstanding data.

+

+Addressing and Transport Selection

+

In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

+

However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

+

+Address Syntax

+

Addresses are represented as strings with the following general syntax: @tt <transport-name>:<transport-address> @endtt

+

For the UX UNIX Domain Socket transport, the addresses has this more specific form:
+

ux:<UNIX domain socket name>
+

The addresses of the UXF UNIX Domain Socket transport variant follow the following format:
+

uxf:<file system path>
+

For the TCP, TLS, UTLS and SCTP transports the syntax is:
+

tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
+
tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
+
utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
+
sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
+

'*' is a shorthand for '0.0.0.0' (=bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent.

+

For example:

tcp:*:4711
+
tls:192.168.1.42:4711
+
tcp:[::1]:99
+
tcp:[*]:4711
+
tls:service:4711
+
sctp:service.company.com:42
+

For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port.

+

+DNS Resolution

+

For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the system's configuration to prioritize between IPv4 and IPv6.

+

+IPv4 Address Format

+

XCM accepts IPv4 addresses in the dotted-decimal format

130.236.254.2
+

XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

+

+Dead Peer Detection

+

XCM transports attempts to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

+

If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

+

+Error Handling

+

In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

+

The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

+

In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

+

The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

+

Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

+

+Event-driven Programming Support

+

In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2) or poll(2) is used.

+

XCM supports this programming model. However, due to the extensive user space state/buffering required for some XCM transports, and the weak correlation between fd read/write state and actual XCM-level message send/receive that follows, XCM is forced to deviate from the BSD Sockets semantics in this regard.

+

+Supported I/O Multiplexing Facilities

+

XCM allows the application to use select() and poll() by direct calls, or using any of the many event-loop libraries. For simplicity, being the most well-known of options, select() is used in this documentation to denote the whole family of POSIX I/O multiplexing facilities.

+

+Non-blocking Operation

+

An event-driven application will set the XCM sockets it handles into non-blocking mode (xcm_set_blocking() or the XCM_NONBLOCK flag to xcm_connect()).

+

For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections, calls - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

+

Many such potentially blocking calls will finish immediately and with success. For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the request.

+

+Non-blocking Connection Establishment

+

In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

+

The application may attempt to send or receive messages on such semi-operational connections.

+

There are ways for an application wishing to know when connection establishment or the task of accepting a new client have finished to do so. See Finishing Outstanding Tasks for more information.

+

+Non-blocking Send and Receive

+

To receive a message on a XCM connection socket in non-blocking mode, the application may wait for the right conditions to arise, by means of calling xcm_want() with the XCM_SO_RECEIVABLE flag set. When select() signals that these conditions are true, the application should issue xcm_receive() to attempt to retrieve a message.

+

xcm_receive() may also called on speculation, prior to any xcm_want() call, to poll the socket for incoming messages.

+

A XCM connection socket may buffer a number of messages, and thus the application should, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN. However, an application may choose to call xcm_want() with XCM_SO_RECEIVABLE set, but in that case, if there are buffered messages, the xcm_want() call will return 0, signaling that the socket doesn't have to do anything in order for the application to receive a message.

+

Similar to receiving a message, an application may use xcm_want() to wait for the right conditions to occur to allow the transmission of a message. Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation, falling back to xcm_want() and select() only in the face of XCM being unable to accept a new message. XCM will signal that this is the case by having xcm_send() returning an error with errno to EAGAIN.

+

For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like security keys exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

+

An application should never attempt to draw any conclusions directly based the state of the fd or fds used by the XCM socket. The fds may be readable, and yet there may be no message to read from XCM, or it may not be readable, but yet there might be one or several messages buffered in the XCM layer. The same lack of correlation holds true also for xcm_send() and the fd writable/non-writable fd state. In addition, XCM may also used file descriptor for other purposes.

+

For applications wishing to know when any outstanding message transmission has finished, it may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also not that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

+

+Finishing Outstanding Tasks

+

xcm_connect(), xcm_accept(), xcm_send() may all leave the connection in a state where work is initiated, but not completed. In addition, the transport may also busy with an internal tasks, such filling its internal buffer with incoming messages, being involved in a key exchange operation (TLS hand shake) or keep alive message transmission or reception.

+

Prior to the select() call, the application must query any XCM connection or server socket it has in non-blocking mode, asking it what events it is waiting for, and on what file descriptor. This is true even if the application neither wants to send or receive (on a connection socket), or accept incoming connections (on a server socket).

+

The file descriptor, and the type of event, may change if the application issues any xcm_* calls on that connection. Easiest for the application is likely to query the connection socket immediately prior to each and every select() call.

+

After waking up from a select() call, where the conditions required by a non-blocking XCM socket are met, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the face of an application having no immediate further use of the socket.

+

The query is made with xcm_want(), and it returns an array of file descriptors and, for each fd, the event type(s) the socket is interested in for that fd.

+

In case the XCM socket has any such needs, the application should wait until the conditions are met (by means of select()). Upon the conditions are met, the application may continue to use the socket.

+

Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks must be finished.

+

+Ready Status Semantics

+

There might be situations that the fd or the fds tied to a XCM connection is marked (by select()) with the appropriate ready status (typically, but not always, write) for a xcm_send() operation to success, but a send may still block (or fail with EAGAIN, if in non-blocking mode). One such may be that the are indeed socket buffer space, but not enough to fit the complete message.

+

The same situation may arise for xcm_receive(). Even though the fd tied to a XCM connection is marked with the appropriate ready status for a message to be received, a xcm_receive() may fail, since the complete message has not yet arrived.

+

Thus, an application may never trust that a xcm_send() or xcm_receive() in blocking mode won't block, and similarly may never trust a send or receive operation to never fail and return EAGAIN, regardless of fd status.

+

See Waiting for Read May Mean Waiting for Write for other reasons that a send or receive may always potentially block.

+

+Waiting for Read May Mean Waiting for Write

+

XCM is designed to allow transports where all the processing is done in the application's thread of control (i.e. no separate OS threads or processes for a connection to do whatever in-band signaling is required for handling retransmission, dead peer detection, key exchange etc). One transport involving a lot of this kind of processing is the TLS Transport.

+

For sockets in blocking mode, this complexity is hidden from the application (except in the form of message reception or transmission latency jitter).

+

For event-driven applications, with their XCM connections in non-blocking mode, this has a non-obvious effect; in order to receive a message, the XCM transport may ask the application to have its thread wait (with select()) for the connection's fd to be marked writable. This is because in order to receive the message, the transport may need to complete some in-band signaling. For example, it may require some new keys for encrypting the outgoing message, since the old have expired.

+

The other way around may also be true; that in order to write a message, the transport may need to have the application to wait for the fd to become readable (since it needs to receive some signaling message from the remote peer in order to proceed).

+

The same holds true also for accept operation on server sockets; in order to accept an incoming request, the transport may ask the application to wait for the fd to be come writable.

+

+Non-blocking Example Sequences

+

+Connect and Send Message

+

In this example, the application connects and immediately tries to send a message. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_want() and select().

+
+ +
+

+Connect with Explicit Finish

+

In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

+
+ +
+

+Immediate Connection Refused

+

While connecting to a server socket, the client's connection attempt may be refused immediately.

+
+ +
+

+Delayed Connection Refused

+

In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

+
+ +
+

+Receiving Buffering

+

In this example, the application runs into a situation where the operation requested may be perfomed immediately (since XCM already have a buffered message).

+
+ +
+

+Buffer Flush Before Close

+

In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

+
+ +
+

+Server Accept

+

In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

+
+ +
+

+Socket Attributes

+

Tied to an XCM server or connection socket is a set of read-only key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

+

The attribute names are strings, and follows a hierarchical naming schema. For example, all generic XCM attributes, expected to be implemented by all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

+

The attribute value is coded in the native C data types and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are three value types; a boolean type, a 64-bit signed integer type and a string type. See xcm_attr_types.h for details.

+

The attribute access API is in xcm_attr.h.

+

Retrieving an integer attribute may look like this (minus error handling):

int64_t rtt;
+
xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
+
printf("Current TCP round-trip time estimate is %ld us.", rtt);
+
int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
+

Process-wide and/or read/write attributes may be supported in the future.

+

+Generic Attributes

+

These attributes are expected to be found on XCM sockets regardless of transport type.

+

For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

+ + + + + + + + + + + + + +
Attribute Name Socket Type Value Type Description
xcm.type All String The socket type - "server" or "connection".
xcm.transport All String The transport type.
xcm.local_addr All String See xcm_local_addr().
xcm.remote_addr Connection String See xcm_remote_addr().
xcm.max_msg_size Connection Integer The maximum size of any message transported by this connection.
+

+Generic Message Counter Attributes

+

XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

+

Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

+

All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

+

The message counters only count messages succesfully sent and/or received.

+ + + + + + + + + + + + + + + + + + + +
Attribute Name Socket Type Value Type Description
xcm.from_app_msgs Connection Integer Messages sent from the application and accepted into XCM.
xcm.from_app_bytes Connection Integer The sum of the size of all messages counted by xcm.from_app_msgs.
xcm.to_app_msgs Connection Integer Messages delivered from XCM to the application.
xcm.to_app_bytes Connection Integer The sum of the size of all messages counter by xcm.to_app_msgs.
xcm.from_lower_msgs Connection Integer Messages received by XCM from the lower layer.
xcm.from_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.from_lower_msgs.
xcm.to_lower_msgs Connection Integer Messages successfully sent by XCM into the lower layer.
xcm.to_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.to_lower_msgs.
+

+Control Interface

+

XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

+

The control interface is optional by means of build-time configuration.

+

For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

+

+Control UNIX Socket Directory

+

By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

+

This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

+

A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

+

+Additional File Descriptors

+

The XCM socket state the control interface allows access to (i.e. the attributes) is owned by the various processes is the system using the XCM library. Thus, to avoid synchronization issues, the control interface is driven by the application's thread(s), although the application is kept unaware of this fact.

+

If the control interface is enabled, some of the file descriptors returned to the application (in xcm_want()) will are not tied to the data interface (i.e. xcm.h and the messaging I/O), but rather the control interface.

+

The control interface is using one file descriptor for the a UNIX domain server socket, and zero or more fds for any control interface clients attached.

+

+Control Interface Error Handling

+

Generally, since the application is left unaware (from an API perspective) from the existence of the control interface, errors are not reported up to the application. They are however logged.

+

Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the prescence of these sockets may be detected, but their state cannot be retrieved.

+

+Control API

+

Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

+

+Command-line Control Program

+

XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

+

+Thread Safety

+

Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all. For non-blocking sockets, the contract of xcm_want() may be broken in so far the conditions on which a thread is waiting for may be change, if another thread calls into that connection socket.

+

It is however safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

+

These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

+

+Multi-processing and Fork

+

Sharing a XCM socket between threads in different processes is not possible.

+

After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

+

The owner may continue to use the XCM socket normally.

+

The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

+

+Transports

+

The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses (which some applications are expected to do) are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without touching the address helper API.

+

+UX Transport

+

The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

+

UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

+

UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

+

UX is the most efficient of the XCM transports.

+

+UX Namespace

+

The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

+

The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

+

The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

+

+UXF Transport

+

The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

+

The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

+

Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

+

+TCP Transport

+

The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

+

TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

+

TCP uses TCP Keepalive to detect lost network connectivity between the peers.

+

The TCP transport supports IPv4 and IPv6.

+

Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

+

+TCP Socket Attributes

+

The TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h). See the tcp(7) manual page, and its section on the TCP_INFO socket option.

+ + + + + + + + + + + +
Attribute Name Socket Type Value Type Description
tcp.rtt Connection Integer The current TCP round-trip estimate (in us).
tcp.total_retrans Connection Integer The total number of retransmitted TCP segments.
tcp.segs_in Connection Integer The total number of segments received.
tcp.segs_out Connection Integer The total number of segments sent.
+
Warning
tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
+

+TLS Transport

+

The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

+

TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

+

The TLS transport supports IPv4 and IPv6.

+

The TLS transport disables the Nagle algorithm of TCP.

+

+TLS Certificate and Key Storage

+

The TLS transport expect the certificate, trust chain and private key files to be found in a file system directory - the certificate directory. The default path are configured at build-time, but can be overriden on a per-process basis by means of a UNIX environment variable. Prior to creating any TLS or UTLS sockets (typically before program start), set XCM_TLS_CERT to change the certificate directory.

+

The TLS transport will, at the time of XCM socket creation (xcm_connect() or xcm_server()), look up the process' current network namespace. In case the namespace is given a name per the iproute2 methods and conventions, XCM will retrieve this name and use it in the certificate and key lookup.

+

In the certificate directory, the TLS transport expects the certificate to follow the below naming convention (where <ns> is the namespace):

cert_<ns>.pem
+

The private key is stored in:

key_<ns>.pem
+

The trust chain is stored in:

tc_<ns>.pem
+

For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trust chain in "tc.pem".

+

In case the certificate, key or trust chain files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

+

+TLS Socket Attributes

+

TLS has all the TCP-level attributes of the TCP transport; see TCP Socket Attributes.

+

+UTLS Transport

+

The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

+

On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

+

For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

+

In the UTLS transport, xcm_want() will return at least two file descriptors; one for the TCP BSD socket file descriptor utilized for TLS, and one for the UNIX domain socket. However, the applications should not depend on this (or the fact that other transports might return fewer).

+

For an UTLS server socket with the address @tt utls:<ip>:<port> @endtt, two underlying addresses will be allocated; @tt tls:<ip>:<port> @endtt and @tt ux:<ip>:<port> @endtt .

+

Or, in the case DNS is used: @tt tls:<hostname>:<port> @endtt and @tt ux:<hostname>:<port> @endtt .

+

+UTLS Limitations

+

A wildcard should never be used when creating a UTLS server socket.

+

If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

+

Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

+

+SCTP Transport

+

The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, and to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

+

The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

+

The SCTP transport supports IPv4 and IPv6.

+

To minimize latency, the SCTP transport disables the Nagle algorithm.

+

+Linux Network and IPC Namespaces

+

Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

+

Linux Network Namespaces will affect all transports, including the UX transport.

+

XCM has no explicit namespace support, but the application is rather expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

+

In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

+

+Limitations

+

XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

+

XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

+
+
+ + + + diff --git a/api/0.11/inline_umlgraph_pnghtml.pu b/api/0.11/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..1f2fe7b0b --- /dev/null +++ b/api/0.11/inline_umlgraph_pnghtml.pu @@ -0,0 +1,127 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_want(conn_socket, XCM_SO_SENDABLE, fds, events, 8); +libxcm -> client: 2, fds=[99, 17], events=[XCM_FD_READABLE, XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(100, [99, 17, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 10); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, XCM_SO_SENDABLE, fds, events, 8); +libxcm -> client: 2, fds=[99, 17], events=[XCM_FD_READABLE, XCM_FD_WRITABLE] +client -> client: build_fd_sets(...); +client -> libc: select(100, [99, ...], [17, ...], [...], NULL); +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 10); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, XCM_SO_SENDABLE, fds, events, 8); +libxcm -> client: 2, fds=[99, 17], events=[XCM_FD_READABLE, XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(100, [99, 17, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 10); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_want(conn_socket, 0, fds, events, 8); +libxcm -> client: 1, fds=[42], events=[XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, 0, fds, events, 8); +libxcm -> client: 1, fds=[42], events=[XCM_FD_WRITABLE] +client -> client: build_fd_sets(...); +client -> libc: select(43, [...], [42, ...], [...], NULL); +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, 0, fds, events, 8); +libxcm -> client: 1, fds=[42], events=[XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_want(conn_socket, XCM_SO_SENDABLE, fds, events, 8); +libxcm -> client: 1, fds=[42], events=[XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_buffering.png +client -> libxcm: xcm_want(conn_socket, XCM_SO_RECEIVABLE, fds, events, 8); +libxcm -> client: 2, fds=[17, 42], events=[XCM_FD_READABLE, XCM_FD_READABLE] +client -> libc: select(43, [17, 42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +client -> libxcm: xcm_want(conn_socket, XCM_SO_RECEIVABLE, fds, events, 8); +libxcm -> client: 0 +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 98 +client -> client: handle_request(buf, 98); +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, 0, fds, events, 8); +libxcm -> client: 1, fds=[12], events=[XCM_FD_WRITABLE] +client -> client: build_fd_sets(...); +client -> libc: select(13, [...], [12, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_want(server_socket, XCM_SO_ACCEPTABLE, fds, events, 8); +libxcm -> client: 3, fds=[4, 8, 9], events=[XCM_FD_READABLE, XCM_FD_READABLE, XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(10, [4, 8, 9, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_want(server_socket, XCM_SO_ACCEPTABLE, fds, events, 8); +libxcm -> client: 3, fds=[4, 8, 9], events=[XCM_FD_READABLE, XCM_FD_READABLE, XCM_FD_READABLE] +client -> libxcm: xcm_want(conn_socket, XCM_SO_RECEIVABLE, fds, events, 8); +libxcm -> client: 1, fds=[11], events=[XCM_FD_READABLE] +client -> libc: select(12, [4, 8, 9, 11, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.11/jquery.js b/api/0.11/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.11/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.11/menu.js b/api/0.11/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.11/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
    '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.11/menudata.js b/api/0.11/menudata.js new file mode 100644 index 000000000..68bf9d308 --- /dev/null +++ b/api/0.11/menudata.js @@ -0,0 +1,42 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.11/minus.svg b/api/0.11/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.11/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.11/minusd.svg b/api/0.11/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.11/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.11/nav_f.png b/api/0.11/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.11/nav_f.png differ diff --git a/api/0.11/nav_fd.png b/api/0.11/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.11/nav_fd.png differ diff --git a/api/0.11/nav_g.png b/api/0.11/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.11/nav_g.png differ diff --git a/api/0.11/nav_h.png b/api/0.11/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.11/nav_h.png differ diff --git a/api/0.11/nav_hd.png b/api/0.11/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.11/nav_hd.png differ diff --git a/api/0.11/nb_buffering.png b/api/0.11/nb_buffering.png new file mode 100644 index 000000000..74984a3dc Binary files /dev/null and b/api/0.11/nb_buffering.png differ diff --git a/api/0.11/nb_connect_and_send.png b/api/0.11/nb_connect_and_send.png new file mode 100644 index 000000000..3b8042586 Binary files /dev/null and b/api/0.11/nb_connect_and_send.png differ diff --git a/api/0.11/nb_connect_explicit.png b/api/0.11/nb_connect_explicit.png new file mode 100644 index 000000000..871dfa494 Binary files /dev/null and b/api/0.11/nb_connect_explicit.png differ diff --git a/api/0.11/nb_delayed_connection_refused.png b/api/0.11/nb_delayed_connection_refused.png new file mode 100644 index 000000000..66df1e5e0 Binary files /dev/null and b/api/0.11/nb_delayed_connection_refused.png differ diff --git a/api/0.11/nb_flush_buffers_before_close.png b/api/0.11/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..df21a059f Binary files /dev/null and b/api/0.11/nb_flush_buffers_before_close.png differ diff --git a/api/0.11/nb_immediate_connection_refused.png b/api/0.11/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.11/nb_immediate_connection_refused.png differ diff --git a/api/0.11/open.png b/api/0.11/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.11/open.png differ diff --git a/api/0.11/plus.svg b/api/0.11/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.11/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.11/plusd.svg b/api/0.11/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.11/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.11/search/all_0.js b/api/0.11/search/all_0.js new file mode 100644 index 000000000..8aa11bc8b --- /dev/null +++ b/api/0.11/search/all_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['additional_20file_20descriptors_1',['Additional File Descriptors',['../index.html#ctl_fds',1,'']]], + ['addr_2',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_3',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_4',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_6',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_8',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_10',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_11',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_12',['Control API',['../index.html#ctl_api',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/api/0.11/search/all_1.js b/api/0.11/search/all_1.js new file mode 100644 index 000000000..7e801f382 --- /dev/null +++ b/api/0.11/search/all_1.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['buffering_6',['Receiving Buffering',['../index.html#nb_buffering',1,'']]] +]; diff --git a/api/0.11/search/all_10.js b/api/0.11/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/api/0.11/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.11/search/all_11.js b/api/0.11/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/api/0.11/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.11/search/all_12.js b/api/0.11/search/all_12.js new file mode 100644 index 000000000..da47b40a6 --- /dev/null +++ b/api/0.11/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['utls_20limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_2',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_3',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_4',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_5',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.11/search/all_13.js b/api/0.11/search/all_13.js new file mode 100644 index 000000000..0a5c37b4f --- /dev/null +++ b/api/0.11/search/all_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['waiting_20for_20read_20may_20mean_20waiting_20for_20write_0',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['with_20explicit_20finish_1',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['write_2',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]] +]; diff --git a/api/0.11/search/all_14.js b/api/0.11/search/all_14.js new file mode 100644 index 000000000..e7d46923b --- /dev/null +++ b/api/0.11/search/all_14.js @@ -0,0 +1,55 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_2eh_2',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_3',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_4',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_5',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_6',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_7',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_8',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_9',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_10',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_11',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_12',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_13',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_14',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_15',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_16',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_17',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_18',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_19',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_20',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_21',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_22',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_23',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_24',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_25',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_26',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcleanup_27',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_28',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_29',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffd_5fexception_30',['XCM_FD_EXCEPTION',['../xcm_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm.h']]], + ['xcm_5ffd_5freadable_31',['XCM_FD_READABLE',['../xcm_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm.h']]], + ['xcm_5ffd_5fwritable_32',['XCM_FD_WRITABLE',['../xcm_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm.h']]], + ['xcm_5ffinish_33',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_34',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_35',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_36',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_37',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_38',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_39',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_40',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_41',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_42',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_43',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_44',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_45',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_46',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_47',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_48',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_49',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_50',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_51',['xcm_want',['../xcm_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm.h']]] +]; diff --git a/api/0.11/search/all_15.js b/api/0.11/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.11/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.11/search/all_16.js b/api/0.11/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/api/0.11/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.11/search/all_2.js b/api/0.11/search/all_2.js new file mode 100644 index 000000000..5d83b14f7 --- /dev/null +++ b/api/0.11/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_3',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_6',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_7',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_8',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_9',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_10',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_11',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_12',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_13',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_14',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/api/0.11/search/all_3.js b/api/0.11/search/all_3.js new file mode 100644 index 000000000..d40618a0b --- /dev/null +++ b/api/0.11/search/all_3.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['descriptors_2',['Additional File Descriptors',['../index.html#ctl_fds',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_6',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.11/search/all_4.js b/api/0.11/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.11/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.11/search/all_5.js b/api/0.11/search/all_5.js new file mode 100644 index 000000000..9609b739b --- /dev/null +++ b/api/0.11/search/all_5.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['file_20descriptors_2',['Additional File Descriptors',['../index.html#ctl_fds',1,'']]], + ['finish_3',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_5',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['for_20read_20may_20mean_20waiting_20for_20write_7',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.11/search/all_6.js b/api/0.11/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/api/0.11/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.11/search/all_7.js b/api/0.11/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.11/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.11/search/all_8.js b/api/0.11/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/api/0.11/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.11/search/all_9.js b/api/0.11/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/api/0.11/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.11/search/all_a.js b/api/0.11/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/api/0.11/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.11/search/all_b.js b/api/0.11/search/all_b.js new file mode 100644 index 000000000..dc344467f --- /dev/null +++ b/api/0.11/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['may_20mean_20waiting_20for_20write_0',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['mean_20waiting_20for_20write_1',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['message_2',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_3',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_4',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.11/search/all_c.js b/api/0.11/search/all_c.js new file mode 100644 index 000000000..62139819c --- /dev/null +++ b/api/0.11/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespaces_1',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['non_20blocking_20connection_20establishment_3',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_4',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_5',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_6',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.11/search/all_d.js b/api/0.11/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/api/0.11/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.11/search/all_e.js b/api/0.11/search/all_e.js new file mode 100644 index 000000000..628cd888d --- /dev/null +++ b/api/0.11/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['processing_20and_20fork_1',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_3',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.11/search/all_f.js b/api/0.11/search/all_f.js new file mode 100644 index 000000000..da2ddfdfe --- /dev/null +++ b/api/0.11/search/all_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['read_20may_20mean_20waiting_20for_20write_0',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['ready_20status_20semantics_1',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_2',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['receiving_20buffering_3',['Receiving Buffering',['../index.html#nb_buffering',1,'']]], + ['refused_4',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_5',['DNS Resolution',['../index.html#dns',1,'']]] +]; diff --git a/api/0.11/search/classes_0.js b/api/0.11/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.11/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.11/search/close.svg b/api/0.11/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.11/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.11/search/defines_0.js b/api/0.11/search/defines_0.js new file mode 100644 index 000000000..0cbdabc3a --- /dev/null +++ b/api/0.11/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.11/search/enums_0.js b/api/0.11/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.11/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.11/search/enumvalues_0.js b/api/0.11/search/enumvalues_0.js new file mode 100644 index 000000000..af8f2e7d7 --- /dev/null +++ b/api/0.11/search/enumvalues_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbool_0',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_1',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_2',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.11/search/files_0.js b/api/0.11/search/files_0.js new file mode 100644 index 000000000..653ea200d --- /dev/null +++ b/api/0.11/search/files_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_3',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]] +]; diff --git a/api/0.11/search/functions_0.js b/api/0.11/search/functions_0.js new file mode 100644 index 000000000..2cfd88abf --- /dev/null +++ b/api/0.11/search/functions_0.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_1',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_2',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_3',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_4',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_5',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_6',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_7',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_8',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_9',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_10',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_11',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_12',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_13',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_14',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_15',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fcleanup_16',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_17',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_18',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffinish_19',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_20',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_21',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_22',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_23',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_24',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_25',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_26',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_27',['xcm_want',['../xcm_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm.h']]] +]; diff --git a/api/0.11/search/groups_0.js b/api/0.11/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.11/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.11/search/groups_1.js b/api/0.11/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.11/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.11/search/groups_2.js b/api/0.11/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.11/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.11/search/mag.svg b/api/0.11/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.11/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.11/search/mag_d.svg b/api/0.11/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.11/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.11/search/mag_sel.svg b/api/0.11/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.11/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.11/search/mag_seld.svg b/api/0.11/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.11/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.11/search/pages_0.js b/api/0.11/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.11/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.11/search/pages_1.js b/api/0.11/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.11/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.11/search/pages_2.js b/api/0.11/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.11/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.11/search/pages_3.js b/api/0.11/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.11/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.11/search/search.css b/api/0.11/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.11/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.11/search/search.js b/api/0.11/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.11/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.11/structxcm__addr__ip.html b/api/0.11/structxcm__addr__ip.html new file mode 100644 index 000000000..fd02d73e4 --- /dev/null +++ b/api/0.11/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.11/sync_off.png b/api/0.11/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.11/sync_off.png differ diff --git a/api/0.11/sync_on.png b/api/0.11/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.11/sync_on.png differ diff --git a/api/0.11/tab_a.png b/api/0.11/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.11/tab_a.png differ diff --git a/api/0.11/tab_ad.png b/api/0.11/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.11/tab_ad.png differ diff --git a/api/0.11/tab_b.png b/api/0.11/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.11/tab_b.png differ diff --git a/api/0.11/tab_bd.png b/api/0.11/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.11/tab_bd.png differ diff --git a/api/0.11/tab_h.png b/api/0.11/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.11/tab_h.png differ diff --git a/api/0.11/tab_hd.png b/api/0.11/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.11/tab_hd.png differ diff --git a/api/0.11/tab_s.png b/api/0.11/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.11/tab_s.png differ diff --git a/api/0.11/tab_sd.png b/api/0.11/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.11/tab_sd.png differ diff --git a/api/0.11/tabs.css b/api/0.11/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.11/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.11/topics.html b/api/0.11/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.11/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.11/xcm_8h.html b/api/0.11/xcm_8h.html new file mode 100644 index 000000000..300f23133 --- /dev/null +++ b/api/0.11/xcm_8h.html @@ -0,0 +1,820 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_want() to retrieve the needed information to be able to wait the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see Waiting for Read May Mean Waiting for Write.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions set by xcm_want() are met (as signaled by select(), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.11/xcm_8h_source.html b/api/0.11/xcm_8h_source.html new file mode 100644 index 000000000..0f51d2ee5 --- /dev/null +++ b/api/0.11/xcm_8h_source.html @@ -0,0 +1,161 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1016#include <errno.h>
    +
    1017#include <stdbool.h>
    +
    1018#include <sys/types.h>
    +
    1019
    +
    1021#define XCM_NONBLOCK (1<<0)
    +
    1022
    +
    1029struct xcm_socket;
    +
    1030
    +
    1082struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1083
    +
    1114struct xcm_socket *xcm_server(const char *local_addr);
    +
    1115
    +
    1132int xcm_close(struct xcm_socket *socket);
    +
    1133
    +
    1153void xcm_cleanup(struct xcm_socket *socket);
    +
    1154
    +
    1177struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1178
    +
    1200int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1201
    +
    1224int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1225
    +
    1227#define XCM_FD_READABLE (1<<0)
    +
    1229#define XCM_FD_WRITABLE (1<<1)
    +
    1231#define XCM_FD_EXCEPTION (1<<2)
    +
    1232
    +
    1235#define XCM_SO_RECEIVABLE (1<<0)
    +
    1238#define XCM_SO_SENDABLE (1<<1)
    +
    1240#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1241
    +
    1331int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    1332 size_t capacity);
    +
    1333
    +
    1373int xcm_finish(struct xcm_socket *socket);
    +
    1374
    +
    1412int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1413
    +
    1425bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1426
    +
    1440const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1441
    +
    1451const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1452
    +
    1453#ifdef __cplusplus
    +
    1454}
    +
    1455#endif
    +
    1456#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    + + + + diff --git a/api/0.11/xcm__addr_8h.html b/api/0.11/xcm__addr_8h.html new file mode 100644 index 000000000..0d4ae6d30 --- /dev/null +++ b/api/0.11/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <sys/types.h>
    +#include <sys/socket.h>
    +#include <netinet/in.h>
    +#include <inttypes.h>
    +#include <errno.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/api/0.11/xcm__addr_8h_source.html b/api/0.11/xcm__addr_8h_source.html new file mode 100644 index 000000000..98fbe0337 --- /dev/null +++ b/api/0.11/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <sys/types.h>
    +
    13#include <sys/socket.h>
    +
    14#include <netinet/in.h>
    +
    15#include <inttypes.h>
    +
    16#include <errno.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.11/xcm__attr_8h.html b/api/0.11/xcm__attr_8h.html new file mode 100644 index 000000000..591db266e --- /dev/null +++ b/api/0.11/xcm__attr_8h.html @@ -0,0 +1,241 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <xcm.h>
    +#include <xcm_attr_types.h>
    +#include <stdbool.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + +

    +Functions

    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a XCM socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.11/xcm__attr_8h_source.html b/api/0.11/xcm__attr_8h_source.html new file mode 100644 index 000000000..a3399db0f --- /dev/null +++ b/api/0.11/xcm__attr_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <xcm.h>
    +
    19#include <xcm_attr_types.h>
    +
    20#include <stdbool.h>
    +
    21
    +
    46int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48
    +
    50typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51 void *value, size_t value_len, void *cb_data);
    +
    52
    +
    66void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data);
    +
    67
    +
    68#ifdef __cplusplus
    +
    69}
    +
    70#endif
    +
    71#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:50
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.11/xcm__attr__map_8h.html b/api/0.11/xcm__attr__map_8h.html new file mode 100644 index 000000000..59daa9439 --- /dev/null +++ b/api/0.11/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <sys/types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]attr_mapThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.11/xcm__attr__map_8h_source.html b/api/0.11/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..ffddb1d72 --- /dev/null +++ b/api/0.11/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <sys/types.h>
    +
    25#include <stdbool.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.11/xcm__attr__types_8h.html b/api/0.11/xcm__attr__types_8h.html new file mode 100644 index 000000000..ec4504a8f --- /dev/null +++ b/api/0.11/xcm__attr__types_8h.html @@ -0,0 +1,127 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    + +
    +
    +
    + + + + diff --git a/api/0.11/xcm__attr__types_8h_source.html b/api/0.11/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..124545bc9 --- /dev/null +++ b/api/0.11/xcm__attr__types_8h_source.html @@ -0,0 +1,117 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    27
    +
    28#ifdef __cplusplus
    +
    29}
    +
    30#endif
    +
    31#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.11/xcm__compat_8h.html b/api/0.11/xcm__compat_8h.html new file mode 100644 index 000000000..70e1c7f10 --- /dev/null +++ b/api/0.11/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see io_waiting.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.11/xcm__compat_8h_source.html b/api/0.11/xcm__compat_8h_source.html new file mode 100644 index 000000000..0af357175 --- /dev/null +++ b/api/0.11/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    118int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    119 size_t capacity);
    +
    120
    +
    121#ifdef __cplusplus
    +
    122}
    +
    123#endif
    +
    124#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.11/xcm__version_8h.html b/api/0.11/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.11/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.11/xcm__version_8h_source.html b/api/0.11/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.11/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.12/annotated.html b/api/0.12/annotated.html new file mode 100644 index 000000000..006ff737a --- /dev/null +++ b/api/0.12/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.12/bc_s.png b/api/0.12/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.12/bc_s.png differ diff --git a/api/0.12/bc_sd.png b/api/0.12/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.12/bc_sd.png differ diff --git a/api/0.12/classes.html b/api/0.12/classes.html new file mode 100644 index 000000000..9737c79d4 --- /dev/null +++ b/api/0.12/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.12/closed.png b/api/0.12/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.12/closed.png differ diff --git a/api/0.12/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.12/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..e746f0f60 --- /dev/null +++ b/api/0.12/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
    +
    + + + + diff --git a/api/0.12/doc.svg b/api/0.12/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.12/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.12/docd.svg b/api/0.12/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.12/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.12/doxygen.css b/api/0.12/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.12/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.12/doxygen.svg b/api/0.12/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.12/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.12/dynsections.js b/api/0.12/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.12/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.12/files.html b/api/0.12/files.html new file mode 100644 index 000000000..10ae9e258 --- /dev/null +++ b/api/0.12/files.html @@ -0,0 +1,90 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
    +
    +
    + + + + diff --git a/api/0.12/folderclosed.svg b/api/0.12/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.12/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.12/folderclosedd.svg b/api/0.12/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.12/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.12/folderopen.svg b/api/0.12/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.12/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.12/folderopend.svg b/api/0.12/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.12/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.12/functions.html b/api/0.12/functions.html new file mode 100644 index 000000000..1c9c537e2 --- /dev/null +++ b/api/0.12/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.12/functions_vars.html b/api/0.12/functions_vars.html new file mode 100644 index 000000000..b5f7b4115 --- /dev/null +++ b/api/0.12/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.12/globals.html b/api/0.12/globals.html new file mode 100644 index 000000000..ddb709a8a --- /dev/null +++ b/api/0.12/globals.html @@ -0,0 +1,129 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.12/globals_defs.html b/api/0.12/globals_defs.html new file mode 100644 index 000000000..acdb9a549 --- /dev/null +++ b/api/0.12/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.12/globals_enum.html b/api/0.12/globals_enum.html new file mode 100644 index 000000000..0f439d759 --- /dev/null +++ b/api/0.12/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.12/globals_eval.html b/api/0.12/globals_eval.html new file mode 100644 index 000000000..4610fc67f --- /dev/null +++ b/api/0.12/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.12/globals_func.html b/api/0.12/globals_func.html new file mode 100644 index 000000000..0115a96bf --- /dev/null +++ b/api/0.12/globals_func.html @@ -0,0 +1,108 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    +
    + + + + diff --git a/api/0.12/globals_type.html b/api/0.12/globals_type.html new file mode 100644 index 000000000..292734bc2 --- /dev/null +++ b/api/0.12/globals_type.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.12/group__api__version.html b/api/0.12/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.12/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.12/group__lib__version.html b/api/0.12/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.12/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.12/index.html b/api/0.12/index.html new file mode 100644 index 000000000..4c71826e1 --- /dev/null +++ b/api/0.12/index.html @@ -0,0 +1,425 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists of of three parts; the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute access API in xcm_attr.h.

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.12
    +

    The low version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation has been stable for several years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow a straight-off mapping to TCP and TLS, but also allow more efficient transport for local communication.

    +

    XCM reuses much of the terminology (and semantics) of the BSD Sockets API.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the receiver in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a very large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant follow the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (=bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent.

    +

    For example:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the system's configuration to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempts to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2) or poll(2) is used.

    +

    XCM supports this programming model. However, due to the extensive user space state/buffering required for some XCM transports, and the weak correlation between fd read/write state and actual XCM-level message send/receive that follows, XCM is forced to deviate from the BSD Sockets semantics in this regard.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM allows the application to use select() and poll() by direct calls, or using any of the many event-loop libraries. For simplicity, being the most well-known of options, select() is used in this documentation to denote the whole family of POSIX I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application will set the XCM sockets it handles into non-blocking mode (xcm_set_blocking() or the XCM_NONBLOCK flag to xcm_connect()).

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections, calls - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    Many such potentially blocking calls will finish immediately and with success. For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the request.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application wishing to know when connection establishment or the task of accepting a new client have finished to do so. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may wait for the right conditions to arise, by means of calling xcm_want() with the XCM_SO_RECEIVABLE flag set. When select() signals that these conditions are true, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any xcm_want() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may buffer a number of messages, and thus the application should, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN. However, an application may choose to call xcm_want() with XCM_SO_RECEIVABLE set, but in that case, if there are buffered messages, the xcm_want() call will return 0, signaling that the socket doesn't have to do anything in order for the application to receive a message.

    +

    Similar to receiving a message, an application may use xcm_want() to wait for the right conditions to occur to allow the transmission of a message. Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation, falling back to xcm_want() and select() only in the face of XCM being unable to accept a new message. XCM will signal that this is the case by having xcm_send() returning an error with errno to EAGAIN.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like security keys exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    An application should never attempt to draw any conclusions directly based the state of the fd or fds used by the XCM socket. The fds may be readable, and yet there may be no message to read from XCM, or it may not be readable, but yet there might be one or several messages buffered in the XCM layer. The same lack of correlation holds true also for xcm_send() and the fd writable/non-writable fd state. In addition, XCM may also used file descriptor for other purposes.

    +

    For applications wishing to know when any outstanding message transmission has finished, it may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also not that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the connection in a state where work is initiated, but not completed. In addition, the transport may also busy with an internal tasks, such filling its internal buffer with incoming messages, being involved in a key exchange operation (TLS hand shake) or keep alive message transmission or reception.

    +

    Prior to the select() call, the application must query any XCM connection or server socket it has in non-blocking mode, asking it what events it is waiting for, and on what file descriptor. This is true even if the application neither wants to send or receive (on a connection socket), or accept incoming connections (on a server socket).

    +

    The file descriptor, and the type of event, may change if the application issues any xcm_* calls on that connection. Easiest for the application is likely to query the connection socket immediately prior to each and every select() call.

    +

    After waking up from a select() call, where the conditions required by a non-blocking XCM socket are met, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the face of an application having no immediate further use of the socket.

    +

    The query is made with xcm_want(), and it returns an array of file descriptors and, for each fd, the event type(s) the socket is interested in for that fd.

    +

    In case the XCM socket has any such needs, the application should wait until the conditions are met (by means of select()). Upon the conditions are met, the application may continue to use the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks must be finished.

    +

    +Ready Status Semantics

    +

    There might be situations that the fd or the fds tied to a XCM connection is marked (by select()) with the appropriate ready status (typically, but not always, write) for a xcm_send() operation to success, but a send may still block (or fail with EAGAIN, if in non-blocking mode). One such may be that the are indeed socket buffer space, but not enough to fit the complete message.

    +

    The same situation may arise for xcm_receive(). Even though the fd tied to a XCM connection is marked with the appropriate ready status for a message to be received, a xcm_receive() may fail, since the complete message has not yet arrived.

    +

    Thus, an application may never trust that a xcm_send() or xcm_receive() in blocking mode won't block, and similarly may never trust a send or receive operation to never fail and return EAGAIN, regardless of fd status.

    +

    See Waiting for Read May Mean Waiting for Write for other reasons that a send or receive may always potentially block.

    +

    +Waiting for Read May Mean Waiting for Write

    +

    XCM is designed to allow transports where all the processing is done in the application's thread of control (i.e. no separate OS threads or processes for a connection to do whatever in-band signaling is required for handling retransmission, dead peer detection, key exchange etc). One transport involving a lot of this kind of processing is the TLS Transport.

    +

    For sockets in blocking mode, this complexity is hidden from the application (except in the form of message reception or transmission latency jitter).

    +

    For event-driven applications, with their XCM connections in non-blocking mode, this has a non-obvious effect; in order to receive a message, the XCM transport may ask the application to have its thread wait (with select()) for the connection's fd to be marked writable. This is because in order to receive the message, the transport may need to complete some in-band signaling. For example, it may require some new keys for encrypting the outgoing message, since the old have expired.

    +

    The other way around may also be true; that in order to write a message, the transport may need to have the application to wait for the fd to become readable (since it needs to receive some signaling message from the remote peer in order to proceed).

    +

    The same holds true also for accept operation on server sockets; in order to accept an incoming request, the transport may ask the application to wait for the fd to be come writable.

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and immediately tries to send a message. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_want() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Receiving Buffering

    +

    In this example, the application runs into a situation where the operation requested may be perfomed immediately (since XCM already have a buffered message).

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of read-only key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    The attribute names are strings, and follows a hierarchical naming schema. For example, all generic XCM attributes, expected to be implemented by all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    The attribute value is coded in the native C data types and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are three value types; a boolean type, a 64-bit signed integer type and a string type. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute may look like this (minus error handling):

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Process-wide and/or read/write attributes may be supported in the future.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    xcm.type All String The socket type - "server" or "connection".
    xcm.transport All String The transport type.
    xcm.local_addr All String See xcm_local_addr().
    xcm.remote_addr Connection String See xcm_remote_addr().
    xcm.max_msg_size Connection Integer The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    xcm.from_app_msgs Connection Integer Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Additional File Descriptors

    +

    The XCM socket state the control interface allows access to (i.e. the attributes) is owned by the various processes is the system using the XCM library. Thus, to avoid synchronization issues, the control interface is driven by the application's thread(s), although the application is kept unaware of this fact.

    +

    If the control interface is enabled, some of the file descriptors returned to the application (in xcm_want()) will are not tied to the data interface (i.e. xcm.h and the messaging I/O), but rather the control interface.

    +

    The control interface is using one file descriptor for the a UNIX domain server socket, and zero or more fds for any control interface clients attached.

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) from the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the prescence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all. For non-blocking sockets, the contract of xcm_want() may be broken in so far the conditions on which a thread is waiting for may be change, if another thread calls into that connection socket.

    +

    It is however safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses (which some applications are expected to do) are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without touching the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h). See the tcp(7) manual page, and its section on the TCP_INFO socket option.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    tcp.rtt Connection Integer The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer The total number of segments received.
    tcp.segs_out Connection Integer The total number of segments sent.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport expect the certificate, trust chain and private key files to be found in a file system directory - the certificate directory. The default path are configured at build-time, but can be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    In case the files in the certificate directory are modified, the new versions of the files will be used by new connections. The TLS transports works with differences between set of files, and thus the new generation of files need not nesserarily be newer (i.e. higher mtime).

    +

    The certificate directory must be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another. One way of achieving an atomic update is to have the certificate directory being a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace with a new one in an atomic manner (i.e. with rename(2)). It's legal to switch back-and-forth between two sets of files, but the time between the back and the forth switch (assuming the atomicity-by-symlink method is used) must be enough to result in different file system modification times on the symbolic link (usually ~10 ms).

    +

    The TLS transport will, at the time of XCM socket creation (xcm_connect() or xcm_server()), look up the process' current network namespace. In case the namespace is given a name per the iproute2 methods and conventions, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In the certificate directory, the TLS transport expects the certificate to follow the below naming convention (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trust chain is stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trust chain in "tc.pem".

    +

    In case the certificate, key or trust chain files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +TLS Socket Attributes

    +

    TLS has all the TCP-level attributes of the TCP transport; see TCP Socket Attributes.

    + + + + + +
    Attribute Name Socket Type Value Type Description
    tls.peer_subject_key_id Connection String The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    In the UTLS transport, xcm_want() will return at least two file descriptors; one for the TCP BSD socket file descriptor utilized for TLS, and one for the UNIX domain socket. However, the applications should not depend on this (or the fact that other transports might return fewer).

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    Or, in the case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, and to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support, but the application is rather expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/api/0.12/inline_umlgraph_pnghtml.pu b/api/0.12/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..1f2fe7b0b --- /dev/null +++ b/api/0.12/inline_umlgraph_pnghtml.pu @@ -0,0 +1,127 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_want(conn_socket, XCM_SO_SENDABLE, fds, events, 8); +libxcm -> client: 2, fds=[99, 17], events=[XCM_FD_READABLE, XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(100, [99, 17, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 10); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, XCM_SO_SENDABLE, fds, events, 8); +libxcm -> client: 2, fds=[99, 17], events=[XCM_FD_READABLE, XCM_FD_WRITABLE] +client -> client: build_fd_sets(...); +client -> libc: select(100, [99, ...], [17, ...], [...], NULL); +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 10); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, XCM_SO_SENDABLE, fds, events, 8); +libxcm -> client: 2, fds=[99, 17], events=[XCM_FD_READABLE, XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(100, [99, 17, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 10); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_want(conn_socket, 0, fds, events, 8); +libxcm -> client: 1, fds=[42], events=[XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, 0, fds, events, 8); +libxcm -> client: 1, fds=[42], events=[XCM_FD_WRITABLE] +client -> client: build_fd_sets(...); +client -> libc: select(43, [...], [42, ...], [...], NULL); +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, 0, fds, events, 8); +libxcm -> client: 1, fds=[42], events=[XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_want(conn_socket, XCM_SO_SENDABLE, fds, events, 8); +libxcm -> client: 1, fds=[42], events=[XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_buffering.png +client -> libxcm: xcm_want(conn_socket, XCM_SO_RECEIVABLE, fds, events, 8); +libxcm -> client: 2, fds=[17, 42], events=[XCM_FD_READABLE, XCM_FD_READABLE] +client -> libc: select(43, [17, 42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +client -> libxcm: xcm_want(conn_socket, XCM_SO_RECEIVABLE, fds, events, 8); +libxcm -> client: 0 +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 98 +client -> client: handle_request(buf, 98); +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_want(conn_socket, 0, fds, events, 8); +libxcm -> client: 1, fds=[12], events=[XCM_FD_WRITABLE] +client -> client: build_fd_sets(...); +client -> libc: select(13, [...], [12, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_want(server_socket, XCM_SO_ACCEPTABLE, fds, events, 8); +libxcm -> client: 3, fds=[4, 8, 9], events=[XCM_FD_READABLE, XCM_FD_READABLE, XCM_FD_READABLE] +client -> client: build_fd_sets(...); +client -> libc: select(10, [4, 8, 9, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_want(server_socket, XCM_SO_ACCEPTABLE, fds, events, 8); +libxcm -> client: 3, fds=[4, 8, 9], events=[XCM_FD_READABLE, XCM_FD_READABLE, XCM_FD_READABLE] +client -> libxcm: xcm_want(conn_socket, XCM_SO_RECEIVABLE, fds, events, 8); +libxcm -> client: 1, fds=[11], events=[XCM_FD_READABLE] +client -> libc: select(12, [4, 8, 9, 11, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.12/jquery.js b/api/0.12/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.12/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.12/menu.js b/api/0.12/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.12/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.12/menudata.js b/api/0.12/menudata.js new file mode 100644 index 000000000..68bf9d308 --- /dev/null +++ b/api/0.12/menudata.js @@ -0,0 +1,42 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.12/minus.svg b/api/0.12/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.12/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.12/minusd.svg b/api/0.12/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.12/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.12/nav_f.png b/api/0.12/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.12/nav_f.png differ diff --git a/api/0.12/nav_fd.png b/api/0.12/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.12/nav_fd.png differ diff --git a/api/0.12/nav_g.png b/api/0.12/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.12/nav_g.png differ diff --git a/api/0.12/nav_h.png b/api/0.12/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.12/nav_h.png differ diff --git a/api/0.12/nav_hd.png b/api/0.12/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.12/nav_hd.png differ diff --git a/api/0.12/nb_buffering.png b/api/0.12/nb_buffering.png new file mode 100644 index 000000000..74984a3dc Binary files /dev/null and b/api/0.12/nb_buffering.png differ diff --git a/api/0.12/nb_connect_and_send.png b/api/0.12/nb_connect_and_send.png new file mode 100644 index 000000000..3b8042586 Binary files /dev/null and b/api/0.12/nb_connect_and_send.png differ diff --git a/api/0.12/nb_connect_explicit.png b/api/0.12/nb_connect_explicit.png new file mode 100644 index 000000000..871dfa494 Binary files /dev/null and b/api/0.12/nb_connect_explicit.png differ diff --git a/api/0.12/nb_delayed_connection_refused.png b/api/0.12/nb_delayed_connection_refused.png new file mode 100644 index 000000000..66df1e5e0 Binary files /dev/null and b/api/0.12/nb_delayed_connection_refused.png differ diff --git a/api/0.12/nb_flush_buffers_before_close.png b/api/0.12/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..df21a059f Binary files /dev/null and b/api/0.12/nb_flush_buffers_before_close.png differ diff --git a/api/0.12/nb_immediate_connection_refused.png b/api/0.12/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.12/nb_immediate_connection_refused.png differ diff --git a/api/0.12/open.png b/api/0.12/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.12/open.png differ diff --git a/api/0.12/plus.svg b/api/0.12/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.12/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.12/plusd.svg b/api/0.12/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.12/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.12/search/all_0.js b/api/0.12/search/all_0.js new file mode 100644 index 000000000..8aa11bc8b --- /dev/null +++ b/api/0.12/search/all_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['additional_20file_20descriptors_1',['Additional File Descriptors',['../index.html#ctl_fds',1,'']]], + ['addr_2',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_3',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_4',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_6',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_8',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_10',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_11',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_12',['Control API',['../index.html#ctl_api',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/api/0.12/search/all_1.js b/api/0.12/search/all_1.js new file mode 100644 index 000000000..7e801f382 --- /dev/null +++ b/api/0.12/search/all_1.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['buffering_6',['Receiving Buffering',['../index.html#nb_buffering',1,'']]] +]; diff --git a/api/0.12/search/all_10.js b/api/0.12/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/api/0.12/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.12/search/all_11.js b/api/0.12/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/api/0.12/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.12/search/all_12.js b/api/0.12/search/all_12.js new file mode 100644 index 000000000..da47b40a6 --- /dev/null +++ b/api/0.12/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['utls_20limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_2',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_3',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_4',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_5',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.12/search/all_13.js b/api/0.12/search/all_13.js new file mode 100644 index 000000000..0a5c37b4f --- /dev/null +++ b/api/0.12/search/all_13.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['waiting_20for_20read_20may_20mean_20waiting_20for_20write_0',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['with_20explicit_20finish_1',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['write_2',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]] +]; diff --git a/api/0.12/search/all_14.js b/api/0.12/search/all_14.js new file mode 100644 index 000000000..2cfc18778 --- /dev/null +++ b/api/0.12/search/all_14.js @@ -0,0 +1,56 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_2eh_2',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_3',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_4',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_5',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_6',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_7',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_8',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_9',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_10',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_11',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_12',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_13',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_14',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_15',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_16',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_17',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_18',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_19',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_20',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_21',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_22',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_23',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_24',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_25',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_26',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_27',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcleanup_28',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_29',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_30',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffd_5fexception_31',['XCM_FD_EXCEPTION',['../xcm_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm.h']]], + ['xcm_5ffd_5freadable_32',['XCM_FD_READABLE',['../xcm_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm.h']]], + ['xcm_5ffd_5fwritable_33',['XCM_FD_WRITABLE',['../xcm_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm.h']]], + ['xcm_5ffinish_34',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_35',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_36',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_37',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_38',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_39',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_40',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_41',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_42',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_43',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_44',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_45',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_46',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_47',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_48',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_49',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_50',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_51',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_52',['xcm_want',['../xcm_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm.h']]] +]; diff --git a/api/0.12/search/all_15.js b/api/0.12/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.12/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.12/search/all_16.js b/api/0.12/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/api/0.12/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.12/search/all_2.js b/api/0.12/search/all_2.js new file mode 100644 index 000000000..5d83b14f7 --- /dev/null +++ b/api/0.12/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_3',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_6',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_7',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_8',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_9',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_10',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_11',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_12',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_13',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_14',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/api/0.12/search/all_3.js b/api/0.12/search/all_3.js new file mode 100644 index 000000000..d40618a0b --- /dev/null +++ b/api/0.12/search/all_3.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['descriptors_2',['Additional File Descriptors',['../index.html#ctl_fds',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_6',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.12/search/all_4.js b/api/0.12/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.12/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.12/search/all_5.js b/api/0.12/search/all_5.js new file mode 100644 index 000000000..9609b739b --- /dev/null +++ b/api/0.12/search/all_5.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['file_20descriptors_2',['Additional File Descriptors',['../index.html#ctl_fds',1,'']]], + ['finish_3',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_5',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['for_20read_20may_20mean_20waiting_20for_20write_7',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.12/search/all_6.js b/api/0.12/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/api/0.12/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.12/search/all_7.js b/api/0.12/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.12/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.12/search/all_8.js b/api/0.12/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/api/0.12/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.12/search/all_9.js b/api/0.12/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/api/0.12/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.12/search/all_a.js b/api/0.12/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/api/0.12/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.12/search/all_b.js b/api/0.12/search/all_b.js new file mode 100644 index 000000000..dc344467f --- /dev/null +++ b/api/0.12/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['may_20mean_20waiting_20for_20write_0',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['mean_20waiting_20for_20write_1',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['message_2',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_3',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_4',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.12/search/all_c.js b/api/0.12/search/all_c.js new file mode 100644 index 000000000..62139819c --- /dev/null +++ b/api/0.12/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespaces_1',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['non_20blocking_20connection_20establishment_3',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_4',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_5',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_6',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.12/search/all_d.js b/api/0.12/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/api/0.12/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.12/search/all_e.js b/api/0.12/search/all_e.js new file mode 100644 index 000000000..628cd888d --- /dev/null +++ b/api/0.12/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['processing_20and_20fork_1',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_3',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.12/search/all_f.js b/api/0.12/search/all_f.js new file mode 100644 index 000000000..da2ddfdfe --- /dev/null +++ b/api/0.12/search/all_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['read_20may_20mean_20waiting_20for_20write_0',['Waiting for Read May Mean Waiting for Write',['../index.html#io_waiting',1,'']]], + ['ready_20status_20semantics_1',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_2',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['receiving_20buffering_3',['Receiving Buffering',['../index.html#nb_buffering',1,'']]], + ['refused_4',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_5',['DNS Resolution',['../index.html#dns',1,'']]] +]; diff --git a/api/0.12/search/classes_0.js b/api/0.12/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.12/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.12/search/close.svg b/api/0.12/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.12/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.12/search/defines_0.js b/api/0.12/search/defines_0.js new file mode 100644 index 000000000..0cbdabc3a --- /dev/null +++ b/api/0.12/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.12/search/enums_0.js b/api/0.12/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.12/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.12/search/enumvalues_0.js b/api/0.12/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.12/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.12/search/files_0.js b/api/0.12/search/files_0.js new file mode 100644 index 000000000..653ea200d --- /dev/null +++ b/api/0.12/search/files_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_3',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]] +]; diff --git a/api/0.12/search/functions_0.js b/api/0.12/search/functions_0.js new file mode 100644 index 000000000..2cfd88abf --- /dev/null +++ b/api/0.12/search/functions_0.js @@ -0,0 +1,31 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_1',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_2',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_3',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_4',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_5',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_6',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_7',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_8',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_9',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_10',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_11',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_12',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_13',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_14',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_15',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fcleanup_16',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_17',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_18',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffinish_19',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_20',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_21',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_22',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_23',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_24',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_25',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_26',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_27',['xcm_want',['../xcm_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm.h']]] +]; diff --git a/api/0.12/search/groups_0.js b/api/0.12/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.12/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.12/search/groups_1.js b/api/0.12/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.12/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.12/search/groups_2.js b/api/0.12/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.12/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.12/search/mag.svg b/api/0.12/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.12/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.12/search/mag_d.svg b/api/0.12/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.12/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.12/search/mag_sel.svg b/api/0.12/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.12/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.12/search/mag_seld.svg b/api/0.12/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.12/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.12/search/pages_0.js b/api/0.12/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.12/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.12/search/pages_1.js b/api/0.12/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.12/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.12/search/pages_2.js b/api/0.12/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.12/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.12/search/pages_3.js b/api/0.12/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.12/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.12/search/search.css b/api/0.12/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.12/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.12/search/search.js b/api/0.12/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.12/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.12/structxcm__addr__ip.html b/api/0.12/structxcm__addr__ip.html new file mode 100644 index 000000000..cddf8e52b --- /dev/null +++ b/api/0.12/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.12/sync_off.png b/api/0.12/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.12/sync_off.png differ diff --git a/api/0.12/sync_on.png b/api/0.12/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.12/sync_on.png differ diff --git a/api/0.12/tab_a.png b/api/0.12/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.12/tab_a.png differ diff --git a/api/0.12/tab_ad.png b/api/0.12/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.12/tab_ad.png differ diff --git a/api/0.12/tab_b.png b/api/0.12/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.12/tab_b.png differ diff --git a/api/0.12/tab_bd.png b/api/0.12/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.12/tab_bd.png differ diff --git a/api/0.12/tab_h.png b/api/0.12/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.12/tab_h.png differ diff --git a/api/0.12/tab_hd.png b/api/0.12/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.12/tab_hd.png differ diff --git a/api/0.12/tab_s.png b/api/0.12/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.12/tab_s.png differ diff --git a/api/0.12/tab_sd.png b/api/0.12/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.12/tab_sd.png differ diff --git a/api/0.12/tabs.css b/api/0.12/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.12/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.12/topics.html b/api/0.12/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.12/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.12/xcm_8h.html b/api/0.12/xcm_8h.html new file mode 100644 index 000000000..16c953e1e --- /dev/null +++ b/api/0.12/xcm_8h.html @@ -0,0 +1,820 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_want() to retrieve the needed information to be able to wait the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see Waiting for Read May Mean Waiting for Write.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions set by xcm_want() are met (as signaled by select(), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.12/xcm_8h_source.html b/api/0.12/xcm_8h_source.html new file mode 100644 index 000000000..fa26da737 --- /dev/null +++ b/api/0.12/xcm_8h_source.html @@ -0,0 +1,161 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1044#include <errno.h>
    +
    1045#include <stdbool.h>
    +
    1046#include <sys/types.h>
    +
    1047
    +
    1049#define XCM_NONBLOCK (1<<0)
    +
    1050
    +
    1057struct xcm_socket;
    +
    1058
    +
    1110struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1111
    +
    1142struct xcm_socket *xcm_server(const char *local_addr);
    +
    1143
    +
    1160int xcm_close(struct xcm_socket *socket);
    +
    1161
    +
    1181void xcm_cleanup(struct xcm_socket *socket);
    +
    1182
    +
    1205struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1206
    +
    1228int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1229
    +
    1252int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1253
    +
    1255#define XCM_FD_READABLE (1<<0)
    +
    1257#define XCM_FD_WRITABLE (1<<1)
    +
    1259#define XCM_FD_EXCEPTION (1<<2)
    +
    1260
    +
    1263#define XCM_SO_RECEIVABLE (1<<0)
    +
    1266#define XCM_SO_SENDABLE (1<<1)
    +
    1268#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1269
    +
    1359int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    1360 size_t capacity);
    +
    1361
    +
    1401int xcm_finish(struct xcm_socket *socket);
    +
    1402
    +
    1440int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1441
    +
    1453bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1454
    +
    1468const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1469
    +
    1479const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1480
    +
    1481#ifdef __cplusplus
    +
    1482}
    +
    1483#endif
    +
    1484#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    + + + + diff --git a/api/0.12/xcm__addr_8h.html b/api/0.12/xcm__addr_8h.html new file mode 100644 index 000000000..7ac2a46dd --- /dev/null +++ b/api/0.12/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <sys/types.h>
    +#include <sys/socket.h>
    +#include <netinet/in.h>
    +#include <inttypes.h>
    +#include <errno.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/api/0.12/xcm__addr_8h_source.html b/api/0.12/xcm__addr_8h_source.html new file mode 100644 index 000000000..5d38a3f6e --- /dev/null +++ b/api/0.12/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <sys/types.h>
    +
    13#include <sys/socket.h>
    +
    14#include <netinet/in.h>
    +
    15#include <inttypes.h>
    +
    16#include <errno.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.12/xcm__attr_8h.html b/api/0.12/xcm__attr_8h.html new file mode 100644 index 000000000..0637336a5 --- /dev/null +++ b/api/0.12/xcm__attr_8h.html @@ -0,0 +1,241 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <xcm.h>
    +#include <xcm_attr_types.h>
    +#include <stdbool.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + +

    +Functions

    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a XCM socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.12/xcm__attr_8h_source.html b/api/0.12/xcm__attr_8h_source.html new file mode 100644 index 000000000..fb6c4f335 --- /dev/null +++ b/api/0.12/xcm__attr_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <xcm.h>
    +
    19#include <xcm_attr_types.h>
    +
    20#include <stdbool.h>
    +
    21
    +
    46int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48
    +
    50typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51 void *value, size_t value_len, void *cb_data);
    +
    52
    +
    66void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data);
    +
    67
    +
    68#ifdef __cplusplus
    +
    69}
    +
    70#endif
    +
    71#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:50
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.12/xcm__attr__map_8h.html b/api/0.12/xcm__attr__map_8h.html new file mode 100644 index 000000000..59daa9439 --- /dev/null +++ b/api/0.12/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <sys/types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]attr_mapThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.12/xcm__attr__map_8h_source.html b/api/0.12/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..ffddb1d72 --- /dev/null +++ b/api/0.12/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <sys/types.h>
    +
    25#include <stdbool.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.12/xcm__attr__types_8h.html b/api/0.12/xcm__attr__types_8h.html new file mode 100644 index 000000000..7b606542f --- /dev/null +++ b/api/0.12/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.12/xcm__attr__types_8h_source.html b/api/0.12/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..4d6cdd27b --- /dev/null +++ b/api/0.12/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.12/xcm__compat_8h.html b/api/0.12/xcm__compat_8h.html new file mode 100644 index 000000000..70e1c7f10 --- /dev/null +++ b/api/0.12/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see io_waiting.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.12/xcm__compat_8h_source.html b/api/0.12/xcm__compat_8h_source.html new file mode 100644 index 000000000..0af357175 --- /dev/null +++ b/api/0.12/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    118int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    119 size_t capacity);
    +
    120
    +
    121#ifdef __cplusplus
    +
    122}
    +
    123#endif
    +
    124#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.12/xcm__version_8h.html b/api/0.12/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.12/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.12/xcm__version_8h_source.html b/api/0.12/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.12/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.13/annotated.html b/api/0.13/annotated.html new file mode 100644 index 000000000..b30a446d2 --- /dev/null +++ b/api/0.13/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.13/bc_s.png b/api/0.13/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.13/bc_s.png differ diff --git a/api/0.13/bc_sd.png b/api/0.13/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.13/bc_sd.png differ diff --git a/api/0.13/classes.html b/api/0.13/classes.html new file mode 100644 index 000000000..5c9d6a504 --- /dev/null +++ b/api/0.13/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.13/closed.png b/api/0.13/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.13/closed.png differ diff --git a/api/0.13/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.13/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..7b739714a --- /dev/null +++ b/api/0.13/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,104 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.13/doc.svg b/api/0.13/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.13/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.13/docd.svg b/api/0.13/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.13/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.13/doxygen.css b/api/0.13/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.13/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.13/doxygen.svg b/api/0.13/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.13/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.13/dynsections.js b/api/0.13/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.13/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.13/files.html b/api/0.13/files.html new file mode 100644 index 000000000..6c6fe09e4 --- /dev/null +++ b/api/0.13/files.html @@ -0,0 +1,91 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/api/0.13/folderclosed.svg b/api/0.13/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.13/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.13/folderclosedd.svg b/api/0.13/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.13/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.13/folderopen.svg b/api/0.13/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.13/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.13/folderopend.svg b/api/0.13/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.13/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.13/functions.html b/api/0.13/functions.html new file mode 100644 index 000000000..33452da82 --- /dev/null +++ b/api/0.13/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.13/functions_vars.html b/api/0.13/functions_vars.html new file mode 100644 index 000000000..04fd324a0 --- /dev/null +++ b/api/0.13/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.13/globals.html b/api/0.13/globals.html new file mode 100644 index 000000000..97401d9d7 --- /dev/null +++ b/api/0.13/globals.html @@ -0,0 +1,131 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.13/globals_defs.html b/api/0.13/globals_defs.html new file mode 100644 index 000000000..818390866 --- /dev/null +++ b/api/0.13/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.13/globals_enum.html b/api/0.13/globals_enum.html new file mode 100644 index 000000000..bb2081755 --- /dev/null +++ b/api/0.13/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.13/globals_eval.html b/api/0.13/globals_eval.html new file mode 100644 index 000000000..cc1c3a68f --- /dev/null +++ b/api/0.13/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.13/globals_func.html b/api/0.13/globals_func.html new file mode 100644 index 000000000..a27929083 --- /dev/null +++ b/api/0.13/globals_func.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    +
    + + + + diff --git a/api/0.13/globals_type.html b/api/0.13/globals_type.html new file mode 100644 index 000000000..ee4b84f14 --- /dev/null +++ b/api/0.13/globals_type.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.13/group__api__version.html b/api/0.13/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.13/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.13/group__lib__version.html b/api/0.13/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.13/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.13/index.html b/api/0.13/index.html new file mode 100644 index 000000000..496bc7350 --- /dev/null +++ b/api/0.13/index.html @@ -0,0 +1,404 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists of of three parts; the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute access API in xcm_attr.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.13 [API]
    +
    +1.0.1 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant follow the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    For example:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempts to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking() or setting the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of read-only key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    The attribute names are strings, and follows a hierarchical naming schema. For example, all generic XCM attributes, expected to be implemented by all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    The attribute value is coded in the native C data types and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are three value types; a boolean type, a 64-bit signed integer type and a string type. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute may look like this (minus error handling):

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Process-wide and/or read/write attributes may be supported in the future.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    xcm.type All String The socket type - "server" or "connection".
    xcm.transport All String The transport type.
    xcm.local_addr All String See xcm_local_addr().
    xcm.remote_addr Connection String See xcm_remote_addr().
    xcm.max_msg_size Connection Integer The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    xcm.from_app_msgs Connection Integer Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) from the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the prescence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h). See the tcp(7) manual page, and its section on the TCP_INFO socket option.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    tcp.rtt Connection Integer The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer The total number of segments received.
    tcp.segs_out Connection Integer The total number of segments sent.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport expect the certificate, trust chain and private key files to be found in a file system directory - the certificate directory. The default path are configured at build-time, but can be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    In case the files in the certificate directory are modified, the new versions of the files will be used by new connections. The TLS transports works with differences between set of files, and thus the new generation of files need not nesserarily be newer (i.e. higher mtime).

    +

    The certificate directory must be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another. One way of achieving an atomic update is to have the certificate directory being a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace with a new one in an atomic manner (i.e. with rename(2)). It's legal to switch back-and-forth between two sets of files, but the time between the back and the forth switch (assuming the atomicity-by-symlink method is used) must be enough to result in different file system modification times on the symbolic link (usually ~10 ms).

    +

    The TLS transport will, at the time of XCM socket creation (xcm_connect() or xcm_server()), look up the process' current network namespace. In case the namespace is given a name per the iproute2 methods and conventions, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In the certificate directory, the TLS transport expects the certificate to follow the below naming convention (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trust chain is stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trust chain in "tc.pem".

    +

    In case the certificate, key or trust chain files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +TLS Socket Attributes

    +

    TLS has all the TCP-level attributes of the TCP transport; see TCP Socket Attributes.

    + + + + + +
    Attribute Name Socket Type Value Type Description
    tls.peer_subject_key_id Connection String The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    Or, in the case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, and to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support, but the application is rather expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/api/0.13/inline_umlgraph_pnghtml.pu b/api/0.13/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/api/0.13/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.13/jquery.js b/api/0.13/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.13/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.13/menu.js b/api/0.13/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.13/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.13/menudata.js b/api/0.13/menudata.js new file mode 100644 index 000000000..68bf9d308 --- /dev/null +++ b/api/0.13/menudata.js @@ -0,0 +1,42 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.13/minus.svg b/api/0.13/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.13/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.13/minusd.svg b/api/0.13/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.13/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.13/nav_f.png b/api/0.13/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.13/nav_f.png differ diff --git a/api/0.13/nav_fd.png b/api/0.13/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.13/nav_fd.png differ diff --git a/api/0.13/nav_g.png b/api/0.13/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.13/nav_g.png differ diff --git a/api/0.13/nav_h.png b/api/0.13/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.13/nav_h.png differ diff --git a/api/0.13/nav_hd.png b/api/0.13/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.13/nav_hd.png differ diff --git a/api/0.13/nb_connect_and_send.png b/api/0.13/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.13/nb_connect_and_send.png differ diff --git a/api/0.13/nb_connect_explicit.png b/api/0.13/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/api/0.13/nb_connect_explicit.png differ diff --git a/api/0.13/nb_delayed_connection_refused.png b/api/0.13/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.13/nb_delayed_connection_refused.png differ diff --git a/api/0.13/nb_flush_buffers_before_close.png b/api/0.13/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.13/nb_flush_buffers_before_close.png differ diff --git a/api/0.13/nb_immediate_connection_refused.png b/api/0.13/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.13/nb_immediate_connection_refused.png differ diff --git a/api/0.13/open.png b/api/0.13/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.13/open.png differ diff --git a/api/0.13/plus.svg b/api/0.13/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.13/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.13/plusd.svg b/api/0.13/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.13/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.13/search/all_0.js b/api/0.13/search/all_0.js new file mode 100644 index 000000000..8b828638d --- /dev/null +++ b/api/0.13/search/all_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attributes_12',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/api/0.13/search/all_1.js b/api/0.13/search/all_1.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/api/0.13/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/api/0.13/search/all_10.js b/api/0.13/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/api/0.13/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.13/search/all_11.js b/api/0.13/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/api/0.13/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.13/search/all_12.js b/api/0.13/search/all_12.js new file mode 100644 index 000000000..da47b40a6 --- /dev/null +++ b/api/0.13/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['utls_20limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_2',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_3',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_4',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_5',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.13/search/all_13.js b/api/0.13/search/all_13.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.13/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.13/search/all_14.js b/api/0.13/search/all_14.js new file mode 100644 index 000000000..05b0d0c72 --- /dev/null +++ b/api/0.13/search/all_14.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_2eh_2',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_3',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_4',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_5',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_6',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_7',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_8',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_9',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_10',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_11',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_12',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_13',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_14',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_15',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_16',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_17',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_18',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_19',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_20',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_21',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_22',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_23',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_24',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_25',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_26',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_27',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_28',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_29',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_30',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_31',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_32',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffd_33',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_34',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_35',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_36',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_37',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_38',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_39',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_40',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_41',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_42',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_43',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_44',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_45',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_46',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_47',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_48',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_49',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_50',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_51',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_52',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_53',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_54',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.13/search/all_15.js b/api/0.13/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.13/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.13/search/all_16.js b/api/0.13/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/api/0.13/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.13/search/all_2.js b/api/0.13/search/all_2.js new file mode 100644 index 000000000..5d83b14f7 --- /dev/null +++ b/api/0.13/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_3',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_6',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_7',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_8',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_9',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_10',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_11',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_12',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_13',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_14',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/api/0.13/search/all_3.js b/api/0.13/search/all_3.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.13/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.13/search/all_4.js b/api/0.13/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.13/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.13/search/all_5.js b/api/0.13/search/all_5.js new file mode 100644 index 000000000..34882611b --- /dev/null +++ b/api/0.13/search/all_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['finish_2',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_3',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_4',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_6',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_7',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.13/search/all_6.js b/api/0.13/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/api/0.13/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.13/search/all_7.js b/api/0.13/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.13/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.13/search/all_8.js b/api/0.13/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/api/0.13/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.13/search/all_9.js b/api/0.13/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/api/0.13/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.13/search/all_a.js b/api/0.13/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/api/0.13/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.13/search/all_b.js b/api/0.13/search/all_b.js new file mode 100644 index 000000000..f955c04ff --- /dev/null +++ b/api/0.13/search/all_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['message_0',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_4',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.13/search/all_c.js b/api/0.13/search/all_c.js new file mode 100644 index 000000000..62139819c --- /dev/null +++ b/api/0.13/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespaces_1',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['non_20blocking_20connection_20establishment_3',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_4',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_5',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_6',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.13/search/all_d.js b/api/0.13/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/api/0.13/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.13/search/all_e.js b/api/0.13/search/all_e.js new file mode 100644 index 000000000..628cd888d --- /dev/null +++ b/api/0.13/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['processing_20and_20fork_1',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_3',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.13/search/all_f.js b/api/0.13/search/all_f.js new file mode 100644 index 000000000..f0491624f --- /dev/null +++ b/api/0.13/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]] +]; diff --git a/api/0.13/search/classes_0.js b/api/0.13/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.13/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.13/search/close.svg b/api/0.13/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.13/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.13/search/defines_0.js b/api/0.13/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/api/0.13/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.13/search/enums_0.js b/api/0.13/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.13/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.13/search/enumvalues_0.js b/api/0.13/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.13/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.13/search/files_0.js b/api/0.13/search/files_0.js new file mode 100644 index 000000000..9ddf96ae9 --- /dev/null +++ b/api/0.13/search/files_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_3',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_4',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.13/search/functions_0.js b/api/0.13/search/functions_0.js new file mode 100644 index 000000000..96c8a4a8f --- /dev/null +++ b/api/0.13/search/functions_0.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_1',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_2',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_3',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_4',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_5',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_6',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_7',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_8',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_9',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_10',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_11',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_12',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_13',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_14',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_15',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fawait_16',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_17',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_18',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_19',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffd_20',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_21',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_22',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_23',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_24',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_25',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_26',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_27',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_28',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_29',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.13/search/groups_0.js b/api/0.13/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.13/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.13/search/groups_1.js b/api/0.13/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.13/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.13/search/groups_2.js b/api/0.13/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.13/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.13/search/mag.svg b/api/0.13/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.13/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.13/search/mag_d.svg b/api/0.13/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.13/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.13/search/mag_sel.svg b/api/0.13/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.13/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.13/search/mag_seld.svg b/api/0.13/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.13/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.13/search/pages_0.js b/api/0.13/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.13/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.13/search/pages_1.js b/api/0.13/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.13/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.13/search/pages_2.js b/api/0.13/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.13/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.13/search/pages_3.js b/api/0.13/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.13/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.13/search/search.css b/api/0.13/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.13/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.13/search/search.js b/api/0.13/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.13/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.13/structxcm__addr__ip.html b/api/0.13/structxcm__addr__ip.html new file mode 100644 index 000000000..92d063be5 --- /dev/null +++ b/api/0.13/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.13/sync_off.png b/api/0.13/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.13/sync_off.png differ diff --git a/api/0.13/sync_on.png b/api/0.13/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.13/sync_on.png differ diff --git a/api/0.13/tab_a.png b/api/0.13/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.13/tab_a.png differ diff --git a/api/0.13/tab_ad.png b/api/0.13/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.13/tab_ad.png differ diff --git a/api/0.13/tab_b.png b/api/0.13/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.13/tab_b.png differ diff --git a/api/0.13/tab_bd.png b/api/0.13/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.13/tab_bd.png differ diff --git a/api/0.13/tab_h.png b/api/0.13/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.13/tab_h.png differ diff --git a/api/0.13/tab_hd.png b/api/0.13/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.13/tab_hd.png differ diff --git a/api/0.13/tab_s.png b/api/0.13/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.13/tab_s.png differ diff --git a/api/0.13/tab_sd.png b/api/0.13/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.13/tab_sd.png differ diff --git a/api/0.13/tabs.css b/api/0.13/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.13/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.13/topics.html b/api/0.13/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.13/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.13/xcm_8h.html b/api/0.13/xcm_8h.html new file mode 100644 index 000000000..9909f6da4 --- /dev/null +++ b/api/0.13/xcm_8h.html @@ -0,0 +1,782 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.13/xcm_8h_source.html b/api/0.13/xcm_8h_source.html new file mode 100644 index 000000000..28308df88 --- /dev/null +++ b/api/0.13/xcm_8h_source.html @@ -0,0 +1,162 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    945#include <errno.h>
    +
    946#include <stdbool.h>
    +
    947#include <sys/types.h>
    +
    948
    +
    950#define XCM_NONBLOCK (1<<0)
    +
    951
    +
    958struct xcm_socket;
    +
    959
    +
    1010struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1011
    +
    1042struct xcm_socket *xcm_server(const char *local_addr);
    +
    1043
    +
    1060int xcm_close(struct xcm_socket *socket);
    +
    1061
    +
    1081void xcm_cleanup(struct xcm_socket *socket);
    +
    1082
    +
    1105struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1106
    +
    1128int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1129
    +
    1152int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1153
    +
    1156#define XCM_SO_RECEIVABLE (1<<0)
    +
    1159#define XCM_SO_SENDABLE (1<<1)
    +
    1161#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1162
    +
    1223int xcm_await(struct xcm_socket *socket, int condition);
    +
    1224
    +
    1266int xcm_fd(struct xcm_socket *socket);
    +
    1267
    +
    1308int xcm_finish(struct xcm_socket *socket);
    +
    1309
    +
    1347int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1348
    +
    1360bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1361
    +
    1375const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1376
    +
    1386const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1387
    +
    1388#include <xcm_compat.h>
    +
    1389
    +
    1390#ifdef __cplusplus
    +
    1391}
    +
    1392#endif
    +
    1393#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.13/xcm__addr_8h.html b/api/0.13/xcm__addr_8h.html new file mode 100644 index 000000000..010360b3f --- /dev/null +++ b/api/0.13/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <sys/types.h>
    +#include <sys/socket.h>
    +#include <netinet/in.h>
    +#include <inttypes.h>
    +#include <errno.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/api/0.13/xcm__addr_8h_source.html b/api/0.13/xcm__addr_8h_source.html new file mode 100644 index 000000000..a22dea795 --- /dev/null +++ b/api/0.13/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <sys/types.h>
    +
    13#include <sys/socket.h>
    +
    14#include <netinet/in.h>
    +
    15#include <inttypes.h>
    +
    16#include <errno.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.13/xcm__attr_8h.html b/api/0.13/xcm__attr_8h.html new file mode 100644 index 000000000..e43f71f6d --- /dev/null +++ b/api/0.13/xcm__attr_8h.html @@ -0,0 +1,241 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <xcm.h>
    +#include <xcm_attr_types.h>
    +#include <stdbool.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + +

    +Functions

    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a XCM socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.13/xcm__attr_8h_source.html b/api/0.13/xcm__attr_8h_source.html new file mode 100644 index 000000000..ee442a6b0 --- /dev/null +++ b/api/0.13/xcm__attr_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <xcm.h>
    +
    19#include <xcm_attr_types.h>
    +
    20#include <stdbool.h>
    +
    21
    +
    46int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48
    +
    50typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51 void *value, size_t value_len, void *cb_data);
    +
    52
    +
    66void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data);
    +
    67
    +
    68#ifdef __cplusplus
    +
    69}
    +
    70#endif
    +
    71#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:50
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.13/xcm__attr__map_8h.html b/api/0.13/xcm__attr__map_8h.html new file mode 100644 index 000000000..59daa9439 --- /dev/null +++ b/api/0.13/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <sys/types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]attr_mapThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.13/xcm__attr__map_8h_source.html b/api/0.13/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..ffddb1d72 --- /dev/null +++ b/api/0.13/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <sys/types.h>
    +
    25#include <stdbool.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.13/xcm__attr__types_8h.html b/api/0.13/xcm__attr__types_8h.html new file mode 100644 index 000000000..ec7d9e271 --- /dev/null +++ b/api/0.13/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.13/xcm__attr__types_8h_source.html b/api/0.13/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..359cc817c --- /dev/null +++ b/api/0.13/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.13/xcm__compat_8h.html b/api/0.13/xcm__compat_8h.html new file mode 100644 index 000000000..70e1c7f10 --- /dev/null +++ b/api/0.13/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see io_waiting.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.13/xcm__compat_8h_source.html b/api/0.13/xcm__compat_8h_source.html new file mode 100644 index 000000000..0af357175 --- /dev/null +++ b/api/0.13/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    118int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    119 size_t capacity);
    +
    120
    +
    121#ifdef __cplusplus
    +
    122}
    +
    123#endif
    +
    124#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.13/xcm__version_8h.html b/api/0.13/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.13/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.13/xcm__version_8h_source.html b/api/0.13/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.13/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.14/annotated.html b/api/0.14/annotated.html new file mode 100644 index 000000000..c7bb9bec3 --- /dev/null +++ b/api/0.14/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.14/bc_s.png b/api/0.14/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.14/bc_s.png differ diff --git a/api/0.14/bc_sd.png b/api/0.14/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.14/bc_sd.png differ diff --git a/api/0.14/classes.html b/api/0.14/classes.html new file mode 100644 index 000000000..4e0231210 --- /dev/null +++ b/api/0.14/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.14/closed.png b/api/0.14/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.14/closed.png differ diff --git a/api/0.14/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.14/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..05c596e39 --- /dev/null +++ b/api/0.14/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.14/doc.svg b/api/0.14/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.14/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.14/docd.svg b/api/0.14/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.14/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.14/doxygen.css b/api/0.14/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.14/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.14/doxygen.svg b/api/0.14/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.14/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.14/dynsections.js b/api/0.14/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.14/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.14/files.html b/api/0.14/files.html new file mode 100644 index 000000000..87bc7735b --- /dev/null +++ b/api/0.14/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/api/0.14/folderclosed.svg b/api/0.14/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.14/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.14/folderclosedd.svg b/api/0.14/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.14/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.14/folderopen.svg b/api/0.14/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.14/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.14/folderopend.svg b/api/0.14/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.14/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.14/functions.html b/api/0.14/functions.html new file mode 100644 index 000000000..e39b61751 --- /dev/null +++ b/api/0.14/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.14/functions_vars.html b/api/0.14/functions_vars.html new file mode 100644 index 000000000..da16b4524 --- /dev/null +++ b/api/0.14/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.14/globals.html b/api/0.14/globals.html new file mode 100644 index 000000000..07c13a8f2 --- /dev/null +++ b/api/0.14/globals.html @@ -0,0 +1,152 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.14/globals_defs.html b/api/0.14/globals_defs.html new file mode 100644 index 000000000..2201ffe9f --- /dev/null +++ b/api/0.14/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.14/globals_enum.html b/api/0.14/globals_enum.html new file mode 100644 index 000000000..ffbea4eb8 --- /dev/null +++ b/api/0.14/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.14/globals_eval.html b/api/0.14/globals_eval.html new file mode 100644 index 000000000..4c42e0225 --- /dev/null +++ b/api/0.14/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.14/globals_func.html b/api/0.14/globals_func.html new file mode 100644 index 000000000..6ded7ff34 --- /dev/null +++ b/api/0.14/globals_func.html @@ -0,0 +1,132 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.14/globals_type.html b/api/0.14/globals_type.html new file mode 100644 index 000000000..19ec59dbb --- /dev/null +++ b/api/0.14/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.14/group__api__version.html b/api/0.14/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.14/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.14/group__lib__version.html b/api/0.14/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.14/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.14/index.html b/api/0.14/index.html new file mode 100644 index 000000000..c957b73e6 --- /dev/null +++ b/api/0.14/index.html @@ -0,0 +1,495 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.14 [API]
    +
    +1.1.0 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    An example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h). See the tcp(7) manual page, and its section on the TCP_INFO socket option.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport expect the certificate, trust chain and private key files to be found in a file system directory - the certificate directory. The default path are configured at build-time, but can be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    In case the files in the certificate directory are modified, the new versions of the files will be used by new connections. The TLS transports works with differences between set of files, and thus the new generation of files need not nesserarily be newer (i.e. higher mtime).

    +

    The certificate directory must be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another. One way of achieving an atomic update is to have the certificate directory being a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace with a new one in an atomic manner (i.e. with rename(2)). It's legal to switch back-and-forth between two sets of files, but the time between the back and the forth switch (assuming the atomicity-by-symlink method is used) must be enough to result in different file system modification times on the symbolic link (usually ~10 ms).

    +

    The TLS transport will, at the time of XCM socket creation (xcm_connect() or xcm_server()), look up the process' current network namespace. In case the namespace is given a name per the iproute2 methods and conventions, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In the certificate directory, the TLS transport expects the certificate to follow the below naming convention (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trust chain is stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trust chain in "tc.pem".

    +

    In case the certificate, key or trust chain files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +TLS Socket Attributes

    +

    TLS has all the TCP-level attributes of the TCP transport; see TCP Socket Attributes.

    + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    Or, in the case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/api/0.14/inline_umlgraph_pnghtml.pu b/api/0.14/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/api/0.14/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.14/jquery.js b/api/0.14/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.14/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.14/menu.js b/api/0.14/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.14/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.14/menudata.js b/api/0.14/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/api/0.14/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.14/minus.svg b/api/0.14/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.14/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.14/minusd.svg b/api/0.14/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.14/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.14/nav_f.png b/api/0.14/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.14/nav_f.png differ diff --git a/api/0.14/nav_fd.png b/api/0.14/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.14/nav_fd.png differ diff --git a/api/0.14/nav_g.png b/api/0.14/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.14/nav_g.png differ diff --git a/api/0.14/nav_h.png b/api/0.14/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.14/nav_h.png differ diff --git a/api/0.14/nav_hd.png b/api/0.14/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.14/nav_hd.png differ diff --git a/api/0.14/nb_connect_and_send.png b/api/0.14/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.14/nb_connect_and_send.png differ diff --git a/api/0.14/nb_connect_explicit.png b/api/0.14/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/api/0.14/nb_connect_explicit.png differ diff --git a/api/0.14/nb_delayed_connection_refused.png b/api/0.14/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.14/nb_delayed_connection_refused.png differ diff --git a/api/0.14/nb_flush_buffers_before_close.png b/api/0.14/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.14/nb_flush_buffers_before_close.png differ diff --git a/api/0.14/nb_immediate_connection_refused.png b/api/0.14/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.14/nb_immediate_connection_refused.png differ diff --git a/api/0.14/open.png b/api/0.14/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.14/open.png differ diff --git a/api/0.14/plus.svg b/api/0.14/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.14/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.14/plusd.svg b/api/0.14/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.14/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.14/search/all_0.js b/api/0.14/search/all_0.js new file mode 100644 index 000000000..4c74c64dd --- /dev/null +++ b/api/0.14/search/all_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/api/0.14/search/all_1.js b/api/0.14/search/all_1.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/api/0.14/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/api/0.14/search/all_10.js b/api/0.14/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/api/0.14/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.14/search/all_11.js b/api/0.14/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/api/0.14/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.14/search/all_12.js b/api/0.14/search/all_12.js new file mode 100644 index 000000000..da47b40a6 --- /dev/null +++ b/api/0.14/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['utls_20limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_2',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_3',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_4',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_5',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.14/search/all_13.js b/api/0.14/search/all_13.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.14/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.14/search/all_14.js b/api/0.14/search/all_14.js new file mode 100644 index 000000000..594300ae7 --- /dev/null +++ b/api/0.14/search/all_14.js @@ -0,0 +1,81 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_2',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_3',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_4',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_5',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_19',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_20',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_23',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_24',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_25',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_26',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_27',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_28',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_29',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_30',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_31',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_32',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_33',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_34',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_35',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_36',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_37',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_38',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_39',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_40',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_41',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_42',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_43',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_44',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_45',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_46',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_47',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_48',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_49',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_50',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_51',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_52',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_53',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_54',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_55',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_56',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_57',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_58',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_59',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_60',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_61',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_62',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_63',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_64',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_65',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_66',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_67',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_68',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_69',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_70',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_71',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_72',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_73',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_74',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_75',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_76',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_77',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.14/search/all_15.js b/api/0.14/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.14/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.14/search/all_16.js b/api/0.14/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/api/0.14/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.14/search/all_2.js b/api/0.14/search/all_2.js new file mode 100644 index 000000000..5d83b14f7 --- /dev/null +++ b/api/0.14/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_3',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_6',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_7',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_8',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_9',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_10',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_11',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_12',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_13',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_14',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/api/0.14/search/all_3.js b/api/0.14/search/all_3.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.14/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.14/search/all_4.js b/api/0.14/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.14/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.14/search/all_5.js b/api/0.14/search/all_5.js new file mode 100644 index 000000000..34882611b --- /dev/null +++ b/api/0.14/search/all_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['finish_2',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_3',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_4',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_6',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_7',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.14/search/all_6.js b/api/0.14/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/api/0.14/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.14/search/all_7.js b/api/0.14/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.14/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.14/search/all_8.js b/api/0.14/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/api/0.14/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.14/search/all_9.js b/api/0.14/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/api/0.14/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.14/search/all_a.js b/api/0.14/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/api/0.14/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.14/search/all_b.js b/api/0.14/search/all_b.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/api/0.14/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.14/search/all_c.js b/api/0.14/search/all_c.js new file mode 100644 index 000000000..62139819c --- /dev/null +++ b/api/0.14/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespaces_1',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['non_20blocking_20connection_20establishment_3',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_4',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_5',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_6',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.14/search/all_d.js b/api/0.14/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/api/0.14/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.14/search/all_e.js b/api/0.14/search/all_e.js new file mode 100644 index 000000000..628cd888d --- /dev/null +++ b/api/0.14/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['processing_20and_20fork_1',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_3',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.14/search/all_f.js b/api/0.14/search/all_f.js new file mode 100644 index 000000000..f0491624f --- /dev/null +++ b/api/0.14/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]] +]; diff --git a/api/0.14/search/classes_0.js b/api/0.14/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.14/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.14/search/close.svg b/api/0.14/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.14/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.14/search/defines_0.js b/api/0.14/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/api/0.14/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.14/search/enums_0.js b/api/0.14/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.14/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.14/search/enumvalues_0.js b/api/0.14/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.14/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.14/search/files_0.js b/api/0.14/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/api/0.14/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.14/search/functions_0.js b/api/0.14/search/functions_0.js new file mode 100644 index 000000000..e1514e5d3 --- /dev/null +++ b/api/0.14/search/functions_0.js @@ -0,0 +1,53 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_17',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_18',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_19',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_20',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_21',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_22',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_23',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_24',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_25',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_26',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_27',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_28',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_29',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_30',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_31',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_32',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_33',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fawait_34',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_35',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_36',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_37',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_38',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_39',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_40',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_41',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_42',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_43',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_44',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_45',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_46',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_47',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_48',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_49',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.14/search/groups_0.js b/api/0.14/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.14/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.14/search/groups_1.js b/api/0.14/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.14/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.14/search/groups_2.js b/api/0.14/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.14/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.14/search/mag.svg b/api/0.14/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.14/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.14/search/mag_d.svg b/api/0.14/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.14/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.14/search/mag_sel.svg b/api/0.14/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.14/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.14/search/mag_seld.svg b/api/0.14/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.14/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.14/search/pages_0.js b/api/0.14/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.14/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.14/search/pages_1.js b/api/0.14/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.14/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.14/search/pages_2.js b/api/0.14/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.14/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.14/search/pages_3.js b/api/0.14/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.14/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.14/search/search.css b/api/0.14/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.14/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.14/search/search.js b/api/0.14/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.14/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.14/structxcm__addr__ip.html b/api/0.14/structxcm__addr__ip.html new file mode 100644 index 000000000..16ba27d7b --- /dev/null +++ b/api/0.14/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.14/sync_off.png b/api/0.14/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.14/sync_off.png differ diff --git a/api/0.14/sync_on.png b/api/0.14/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.14/sync_on.png differ diff --git a/api/0.14/tab_a.png b/api/0.14/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.14/tab_a.png differ diff --git a/api/0.14/tab_ad.png b/api/0.14/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.14/tab_ad.png differ diff --git a/api/0.14/tab_b.png b/api/0.14/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.14/tab_b.png differ diff --git a/api/0.14/tab_bd.png b/api/0.14/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.14/tab_bd.png differ diff --git a/api/0.14/tab_h.png b/api/0.14/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.14/tab_h.png differ diff --git a/api/0.14/tab_hd.png b/api/0.14/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.14/tab_hd.png differ diff --git a/api/0.14/tab_s.png b/api/0.14/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.14/tab_s.png differ diff --git a/api/0.14/tab_sd.png b/api/0.14/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.14/tab_sd.png differ diff --git a/api/0.14/tabs.css b/api/0.14/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.14/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.14/topics.html b/api/0.14/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.14/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.14/xcm_8h.html b/api/0.14/xcm_8h.html new file mode 100644 index 000000000..ccb364210 --- /dev/null +++ b/api/0.14/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.14/xcm_8h_source.html b/api/0.14/xcm_8h_source.html new file mode 100644 index 000000000..ea83bd838 --- /dev/null +++ b/api/0.14/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    979#include <errno.h>
    +
    980#include <stdbool.h>
    +
    981#include <sys/types.h>
    +
    982
    +
    983#include <xcm_attr_map.h>
    +
    984
    +
    986#define XCM_NONBLOCK (1<<0)
    +
    987
    +
    994struct xcm_socket;
    +
    995
    +
    1046struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1047
    +
    1069struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1070 const struct xcm_attr_map *attrs);
    +
    1071
    +
    1102struct xcm_socket *xcm_server(const char *local_addr);
    +
    1103
    +
    1119struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1120 const struct xcm_attr_map *attrs);
    +
    1121
    +
    1138int xcm_close(struct xcm_socket *socket);
    +
    1139
    +
    1159void xcm_cleanup(struct xcm_socket *socket);
    +
    1160
    +
    1183struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1184
    +
    1201struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1202 const struct xcm_attr_map *attrs);
    +
    1203
    +
    1225int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1226
    +
    1249int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1250
    +
    1253#define XCM_SO_RECEIVABLE (1<<0)
    +
    1256#define XCM_SO_SENDABLE (1<<1)
    +
    1258#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1259
    +
    1320int xcm_await(struct xcm_socket *socket, int condition);
    +
    1321
    +
    1363int xcm_fd(struct xcm_socket *socket);
    +
    1364
    +
    1405int xcm_finish(struct xcm_socket *socket);
    +
    1406
    +
    1447int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1448
    +
    1463bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1464
    +
    1481const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1482
    +
    1497const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1498
    +
    1499#include <xcm_compat.h>
    +
    1500
    +
    1501#ifdef __cplusplus
    +
    1502}
    +
    1503#endif
    +
    1504#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.14/xcm__addr_8h.html b/api/0.14/xcm__addr_8h.html new file mode 100644 index 000000000..8da011ca8 --- /dev/null +++ b/api/0.14/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <sys/types.h>
    +#include <sys/socket.h>
    +#include <netinet/in.h>
    +#include <inttypes.h>
    +#include <errno.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/api/0.14/xcm__addr_8h_source.html b/api/0.14/xcm__addr_8h_source.html new file mode 100644 index 000000000..941e9825a --- /dev/null +++ b/api/0.14/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <sys/types.h>
    +
    13#include <sys/socket.h>
    +
    14#include <netinet/in.h>
    +
    15#include <inttypes.h>
    +
    16#include <errno.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.14/xcm__attr_8h.html b/api/0.14/xcm__attr_8h.html new file mode 100644 index 000000000..5757dca11 --- /dev/null +++ b/api/0.14/xcm__attr_8h.html @@ -0,0 +1,314 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <xcm.h>
    +#include <xcm_attr_types.h>
    +#include <stdbool.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_get (struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * s,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a XCM socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]value_lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * s,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a XCM socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.14/xcm__attr_8h_source.html b/api/0.14/xcm__attr_8h_source.html new file mode 100644 index 000000000..babea613c --- /dev/null +++ b/api/0.14/xcm__attr_8h_source.html @@ -0,0 +1,127 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <xcm.h>
    +
    19#include <xcm_attr_types.h>
    +
    20#include <stdbool.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *s, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    72int xcm_attr_get(struct xcm_socket *s, const char *name,
    +
    73 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    74
    +
    76typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    77 void *value, size_t value_len, void *cb_data);
    +
    78
    +
    92void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data);
    +
    93
    +
    94#ifdef __cplusplus
    +
    95}
    +
    96#endif
    +
    97#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_get(struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_set(struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:76
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.14/xcm__attr__map_8h.html b/api/0.14/xcm__attr__map_8h.html new file mode 100644 index 000000000..59daa9439 --- /dev/null +++ b/api/0.14/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <sys/types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]attr_mapThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.14/xcm__attr__map_8h_source.html b/api/0.14/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..ffddb1d72 --- /dev/null +++ b/api/0.14/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <sys/types.h>
    +
    25#include <stdbool.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.14/xcm__attr__types_8h.html b/api/0.14/xcm__attr__types_8h.html new file mode 100644 index 000000000..1901e5623 --- /dev/null +++ b/api/0.14/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.14/xcm__attr__types_8h_source.html b/api/0.14/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..3a6be5a82 --- /dev/null +++ b/api/0.14/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.14/xcm__compat_8h.html b/api/0.14/xcm__compat_8h.html new file mode 100644 index 000000000..becacac7b --- /dev/null +++ b/api/0.14/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see io_waiting.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.14/xcm__compat_8h_source.html b/api/0.14/xcm__compat_8h_source.html new file mode 100644 index 000000000..b13dede32 --- /dev/null +++ b/api/0.14/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    118int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    119 size_t capacity);
    +
    120
    +
    121#ifdef __cplusplus
    +
    122}
    +
    123#endif
    +
    124#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.14/xcm__version_8h.html b/api/0.14/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.14/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.14/xcm__version_8h_source.html b/api/0.14/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.14/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.15/annotated.html b/api/0.15/annotated.html new file mode 100644 index 000000000..a056c1eda --- /dev/null +++ b/api/0.15/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.15/bc_s.png b/api/0.15/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.15/bc_s.png differ diff --git a/api/0.15/bc_sd.png b/api/0.15/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.15/bc_sd.png differ diff --git a/api/0.15/classes.html b/api/0.15/classes.html new file mode 100644 index 000000000..494743e86 --- /dev/null +++ b/api/0.15/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.15/closed.png b/api/0.15/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.15/closed.png differ diff --git a/api/0.15/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.15/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..0d6e06947 --- /dev/null +++ b/api/0.15/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.15/doc.svg b/api/0.15/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.15/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.15/docd.svg b/api/0.15/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.15/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.15/doxygen.css b/api/0.15/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.15/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.15/doxygen.svg b/api/0.15/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.15/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.15/dynsections.js b/api/0.15/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.15/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.15/files.html b/api/0.15/files.html new file mode 100644 index 000000000..e38d81a6a --- /dev/null +++ b/api/0.15/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/api/0.15/folderclosed.svg b/api/0.15/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.15/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.15/folderclosedd.svg b/api/0.15/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.15/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.15/folderopen.svg b/api/0.15/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.15/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.15/folderopend.svg b/api/0.15/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.15/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.15/functions.html b/api/0.15/functions.html new file mode 100644 index 000000000..e3ffda096 --- /dev/null +++ b/api/0.15/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.15/functions_vars.html b/api/0.15/functions_vars.html new file mode 100644 index 000000000..14a8616fb --- /dev/null +++ b/api/0.15/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.15/globals.html b/api/0.15/globals.html new file mode 100644 index 000000000..ae11be3a8 --- /dev/null +++ b/api/0.15/globals.html @@ -0,0 +1,158 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.15/globals_defs.html b/api/0.15/globals_defs.html new file mode 100644 index 000000000..552998c09 --- /dev/null +++ b/api/0.15/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.15/globals_enum.html b/api/0.15/globals_enum.html new file mode 100644 index 000000000..d986f22b2 --- /dev/null +++ b/api/0.15/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.15/globals_eval.html b/api/0.15/globals_eval.html new file mode 100644 index 000000000..d5545d017 --- /dev/null +++ b/api/0.15/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.15/globals_func.html b/api/0.15/globals_func.html new file mode 100644 index 000000000..a55e13d07 --- /dev/null +++ b/api/0.15/globals_func.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.15/globals_type.html b/api/0.15/globals_type.html new file mode 100644 index 000000000..34143592c --- /dev/null +++ b/api/0.15/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.15/group__api__version.html b/api/0.15/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.15/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.15/group__lib__version.html b/api/0.15/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.15/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.15/index.html b/api/0.15/index.html new file mode 100644 index 000000000..5a5d20075 --- /dev/null +++ b/api/0.15/index.html @@ -0,0 +1,509 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.15 [API]
    +
    +1.1.0 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    An example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport expect the certificate, trust chain and private key files to be found in a file system directory - the certificate directory. The default path are configured at build-time, but can be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    In case the files in the certificate directory are modified, the new versions of the files will be used by new connections. The TLS transports works with differences between set of files, and thus the new generation of files need not nesserarily be newer (i.e. higher mtime).

    +

    The certificate directory must be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another. One way of achieving an atomic update is to have the certificate directory being a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace with a new one in an atomic manner (i.e. with rename(2)). It's legal to switch back-and-forth between two sets of files, but the time between the back and the forth switch (assuming the atomicity-by-symlink method is used) must be enough to result in different file system modification times on the symbolic link (usually ~10 ms).

    +

    The TLS transport will, at the time of XCM socket creation (xcm_connect() or xcm_server()), look up the process' current network namespace. In case the namespace is given a name per the iproute2 methods and conventions, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In the certificate directory, the TLS transport expects the certificate to follow the below naming convention (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trust chain is stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trust chain in "tc.pem".

    +

    In case the certificate, key or trust chain files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +TLS Socket Attributes

    +

    TLS has all the TCP-level attributes of the TCP transport; see TCP Socket Attributes.

    + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    Or, in the case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/api/0.15/inline_umlgraph_pnghtml.pu b/api/0.15/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/api/0.15/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.15/jquery.js b/api/0.15/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.15/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.15/menu.js b/api/0.15/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.15/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.15/menudata.js b/api/0.15/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/api/0.15/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.15/minus.svg b/api/0.15/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.15/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.15/minusd.svg b/api/0.15/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.15/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.15/nav_f.png b/api/0.15/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.15/nav_f.png differ diff --git a/api/0.15/nav_fd.png b/api/0.15/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.15/nav_fd.png differ diff --git a/api/0.15/nav_g.png b/api/0.15/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.15/nav_g.png differ diff --git a/api/0.15/nav_h.png b/api/0.15/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.15/nav_h.png differ diff --git a/api/0.15/nav_hd.png b/api/0.15/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.15/nav_hd.png differ diff --git a/api/0.15/nb_connect_and_send.png b/api/0.15/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.15/nb_connect_and_send.png differ diff --git a/api/0.15/nb_connect_explicit.png b/api/0.15/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/api/0.15/nb_connect_explicit.png differ diff --git a/api/0.15/nb_delayed_connection_refused.png b/api/0.15/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.15/nb_delayed_connection_refused.png differ diff --git a/api/0.15/nb_flush_buffers_before_close.png b/api/0.15/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.15/nb_flush_buffers_before_close.png differ diff --git a/api/0.15/nb_immediate_connection_refused.png b/api/0.15/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.15/nb_immediate_connection_refused.png differ diff --git a/api/0.15/open.png b/api/0.15/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.15/open.png differ diff --git a/api/0.15/plus.svg b/api/0.15/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.15/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.15/plusd.svg b/api/0.15/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.15/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.15/search/all_0.js b/api/0.15/search/all_0.js new file mode 100644 index 000000000..4c74c64dd --- /dev/null +++ b/api/0.15/search/all_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/api/0.15/search/all_1.js b/api/0.15/search/all_1.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/api/0.15/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/api/0.15/search/all_10.js b/api/0.15/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/api/0.15/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.15/search/all_11.js b/api/0.15/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/api/0.15/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.15/search/all_12.js b/api/0.15/search/all_12.js new file mode 100644 index 000000000..da47b40a6 --- /dev/null +++ b/api/0.15/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['utls_20limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_2',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_3',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_4',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_5',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.15/search/all_13.js b/api/0.15/search/all_13.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.15/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.15/search/all_14.js b/api/0.15/search/all_14.js new file mode 100644 index 000000000..7ea6a908f --- /dev/null +++ b/api/0.15/search/all_14.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_2',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_3',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_4',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_5',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_19',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_20',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_23',['xcm_attr_get_bool',['../xcm__attr_8h.html#af56192a489902f0b672f9d80f727c6db',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_24',['xcm_attr_get_int64',['../xcm__attr_8h.html#a9dc368c8e5800c6427935d5031d377bd',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_25',['xcm_attr_get_str',['../xcm__attr_8h.html#aaae1fd6d48381a5c6b3f301aa93e0db4',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_26',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_27',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_28',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_29',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_30',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_31',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_32',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_33',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_34',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_35',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_36',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_37',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_38',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_39',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_40',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_41',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_42',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_43',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_44',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_45',['xcm_attr_set_bool',['../xcm__attr_8h.html#ac8033ada81b2a404a803c2d651b2ba60',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_46',['xcm_attr_set_int64',['../xcm__attr_8h.html#a04fd6fe3d498515a5d4979b2bbb42c83',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_47',['xcm_attr_set_str',['../xcm__attr_8h.html#afb84c5dbcc633d9827ab07bd25d5bbd2',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_48',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_49',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_50',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_51',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_52',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_53',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_54',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_55',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_56',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_57',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_58',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_59',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_60',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_61',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_62',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_63',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_64',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_65',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_66',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_67',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_68',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_69',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_70',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_71',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_72',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_73',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_74',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_75',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_76',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_77',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_78',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_79',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_80',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_81',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_82',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_83',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.15/search/all_15.js b/api/0.15/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.15/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.15/search/all_16.js b/api/0.15/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/api/0.15/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.15/search/all_2.js b/api/0.15/search/all_2.js new file mode 100644 index 000000000..5d83b14f7 --- /dev/null +++ b/api/0.15/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_3',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_6',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_7',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_8',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_9',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_10',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_11',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_12',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_13',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_14',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/api/0.15/search/all_3.js b/api/0.15/search/all_3.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.15/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.15/search/all_4.js b/api/0.15/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.15/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.15/search/all_5.js b/api/0.15/search/all_5.js new file mode 100644 index 000000000..34882611b --- /dev/null +++ b/api/0.15/search/all_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['finish_2',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_3',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_4',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_6',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_7',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.15/search/all_6.js b/api/0.15/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/api/0.15/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.15/search/all_7.js b/api/0.15/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.15/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.15/search/all_8.js b/api/0.15/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/api/0.15/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.15/search/all_9.js b/api/0.15/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/api/0.15/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.15/search/all_a.js b/api/0.15/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/api/0.15/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.15/search/all_b.js b/api/0.15/search/all_b.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/api/0.15/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.15/search/all_c.js b/api/0.15/search/all_c.js new file mode 100644 index 000000000..62139819c --- /dev/null +++ b/api/0.15/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespaces_1',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['non_20blocking_20connection_20establishment_3',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_4',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_5',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_6',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.15/search/all_d.js b/api/0.15/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/api/0.15/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.15/search/all_e.js b/api/0.15/search/all_e.js new file mode 100644 index 000000000..628cd888d --- /dev/null +++ b/api/0.15/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['processing_20and_20fork_1',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_3',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.15/search/all_f.js b/api/0.15/search/all_f.js new file mode 100644 index 000000000..f0491624f --- /dev/null +++ b/api/0.15/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]] +]; diff --git a/api/0.15/search/classes_0.js b/api/0.15/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.15/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.15/search/close.svg b/api/0.15/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.15/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.15/search/defines_0.js b/api/0.15/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/api/0.15/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.15/search/enums_0.js b/api/0.15/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.15/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.15/search/enumvalues_0.js b/api/0.15/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.15/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.15/search/files_0.js b/api/0.15/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/api/0.15/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.15/search/functions_0.js b/api/0.15/search/functions_0.js new file mode 100644 index 000000000..0d0bef284 --- /dev/null +++ b/api/0.15/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_17',['xcm_attr_get_bool',['../xcm__attr_8h.html#af56192a489902f0b672f9d80f727c6db',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_18',['xcm_attr_get_int64',['../xcm__attr_8h.html#a9dc368c8e5800c6427935d5031d377bd',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_19',['xcm_attr_get_str',['../xcm__attr_8h.html#aaae1fd6d48381a5c6b3f301aa93e0db4',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_20',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_21',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_22',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_23',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_24',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_25',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_26',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_27',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_28',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_29',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_30',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_31',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_32',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_33',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_34',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_35',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_36',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_37',['xcm_attr_set_bool',['../xcm__attr_8h.html#ac8033ada81b2a404a803c2d651b2ba60',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_38',['xcm_attr_set_int64',['../xcm__attr_8h.html#a04fd6fe3d498515a5d4979b2bbb42c83',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_39',['xcm_attr_set_str',['../xcm__attr_8h.html#afb84c5dbcc633d9827ab07bd25d5bbd2',1,'xcm_attr.h']]], + ['xcm_5fawait_40',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_41',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_42',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_43',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_44',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_45',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_46',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_47',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_48',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_49',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_50',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_51',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_52',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_53',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_54',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.15/search/groups_0.js b/api/0.15/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.15/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.15/search/groups_1.js b/api/0.15/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.15/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.15/search/groups_2.js b/api/0.15/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.15/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.15/search/mag.svg b/api/0.15/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.15/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.15/search/mag_d.svg b/api/0.15/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.15/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.15/search/mag_sel.svg b/api/0.15/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.15/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.15/search/mag_seld.svg b/api/0.15/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.15/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.15/search/pages_0.js b/api/0.15/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.15/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.15/search/pages_1.js b/api/0.15/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.15/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.15/search/pages_2.js b/api/0.15/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.15/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.15/search/pages_3.js b/api/0.15/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.15/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.15/search/search.css b/api/0.15/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.15/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.15/search/search.js b/api/0.15/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.15/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.15/structxcm__addr__ip.html b/api/0.15/structxcm__addr__ip.html new file mode 100644 index 000000000..c16b1281d --- /dev/null +++ b/api/0.15/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.15/sync_off.png b/api/0.15/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.15/sync_off.png differ diff --git a/api/0.15/sync_on.png b/api/0.15/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.15/sync_on.png differ diff --git a/api/0.15/tab_a.png b/api/0.15/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.15/tab_a.png differ diff --git a/api/0.15/tab_ad.png b/api/0.15/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.15/tab_ad.png differ diff --git a/api/0.15/tab_b.png b/api/0.15/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.15/tab_b.png differ diff --git a/api/0.15/tab_bd.png b/api/0.15/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.15/tab_bd.png differ diff --git a/api/0.15/tab_h.png b/api/0.15/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.15/tab_h.png differ diff --git a/api/0.15/tab_hd.png b/api/0.15/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.15/tab_hd.png differ diff --git a/api/0.15/tab_s.png b/api/0.15/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.15/tab_s.png differ diff --git a/api/0.15/tab_sd.png b/api/0.15/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.15/tab_sd.png differ diff --git a/api/0.15/tabs.css b/api/0.15/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.15/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.15/topics.html b/api/0.15/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.15/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.15/xcm_8h.html b/api/0.15/xcm_8h.html new file mode 100644 index 000000000..d6308f119 --- /dev/null +++ b/api/0.15/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.15/xcm_8h_source.html b/api/0.15/xcm_8h_source.html new file mode 100644 index 000000000..7bceba2ff --- /dev/null +++ b/api/0.15/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    991#include <errno.h>
    +
    992#include <stdbool.h>
    +
    993#include <sys/types.h>
    +
    994
    +
    995#include <xcm_attr_map.h>
    +
    996
    +
    998#define XCM_NONBLOCK (1<<0)
    +
    999
    +
    1006struct xcm_socket;
    +
    1007
    +
    1058struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1059
    +
    1081struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1082 const struct xcm_attr_map *attrs);
    +
    1083
    +
    1114struct xcm_socket *xcm_server(const char *local_addr);
    +
    1115
    +
    1131struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1132 const struct xcm_attr_map *attrs);
    +
    1133
    +
    1150int xcm_close(struct xcm_socket *socket);
    +
    1151
    +
    1171void xcm_cleanup(struct xcm_socket *socket);
    +
    1172
    +
    1195struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1196
    +
    1213struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1214 const struct xcm_attr_map *attrs);
    +
    1215
    +
    1237int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1238
    +
    1261int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1262
    +
    1265#define XCM_SO_RECEIVABLE (1<<0)
    +
    1268#define XCM_SO_SENDABLE (1<<1)
    +
    1270#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1271
    +
    1332int xcm_await(struct xcm_socket *socket, int condition);
    +
    1333
    +
    1375int xcm_fd(struct xcm_socket *socket);
    +
    1376
    +
    1417int xcm_finish(struct xcm_socket *socket);
    +
    1418
    +
    1459int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1460
    +
    1475bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1476
    +
    1493const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1494
    +
    1509const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1510
    +
    1511#include <xcm_compat.h>
    +
    1512
    +
    1513#ifdef __cplusplus
    +
    1514}
    +
    1515#endif
    +
    1516#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.15/xcm__addr_8h.html b/api/0.15/xcm__addr_8h.html new file mode 100644 index 000000000..a56ba1941 --- /dev/null +++ b/api/0.15/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/api/0.15/xcm__addr_8h_source.html b/api/0.15/xcm__addr_8h_source.html new file mode 100644 index 000000000..ff84633fd --- /dev/null +++ b/api/0.15/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.15/xcm__attr_8h.html b/api/0.15/xcm__attr_8h.html new file mode 100644 index 000000000..a4a255196 --- /dev/null +++ b/api/0.15/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *s, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *s, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *s, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *s, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *s, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *s, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * s,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]value_lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * s,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * s,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * s,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * s,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * s,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * s,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * s,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.15/xcm__attr_8h_source.html b/api/0.15/xcm__attr_8h_source.html new file mode 100644 index 000000000..0cb779428 --- /dev/null +++ b/api/0.15/xcm__attr_8h_source.html @@ -0,0 +1,149 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *s, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *s, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *s, const char *name, int64_t value);
    +
    74
    +
    87int xcm_attr_set_str(struct xcm_socket *s, const char *name,
    +
    88 const char *value);
    +
    89
    +
    115int xcm_attr_get(struct xcm_socket *s, const char *name,
    +
    116 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    117
    +
    134int xcm_attr_get_bool(struct xcm_socket *s, const char *name,
    +
    135 bool *value);
    +
    136
    +
    153int xcm_attr_get_int64(struct xcm_socket *s, const char *name,
    +
    154 int64_t *value);
    +
    155
    +
    174int xcm_attr_get_str(struct xcm_socket *s, const char *name,
    +
    175 char *value, size_t capacity);
    +
    176
    +
    178typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    179 void *value, size_t value_len, void *cb_data);
    +
    180
    +
    194void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data);
    +
    195
    +
    196#ifdef __cplusplus
    +
    197}
    +
    198#endif
    +
    199#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_int64(struct xcm_socket *s, const char *name, int64_t value)
    +
    int xcm_attr_get(struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_set(struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_get_int64(struct xcm_socket *s, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *s, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_bool(struct xcm_socket *s, const char *name, bool value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:178
    +
    int xcm_attr_get_bool(struct xcm_socket *s, const char *name, bool *value)
    +
    int xcm_attr_set_str(struct xcm_socket *s, const char *name, const char *value)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.15/xcm__attr__map_8h.html b/api/0.15/xcm__attr__map_8h.html new file mode 100644 index 000000000..78e15ff91 --- /dev/null +++ b/api/0.15/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]attr_mapThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.15/xcm__attr__map_8h_source.html b/api/0.15/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..465029483 --- /dev/null +++ b/api/0.15/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.15/xcm__attr__types_8h.html b/api/0.15/xcm__attr__types_8h.html new file mode 100644 index 000000000..20faeca03 --- /dev/null +++ b/api/0.15/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.15/xcm__attr__types_8h_source.html b/api/0.15/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..da875f9cf --- /dev/null +++ b/api/0.15/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.15/xcm__compat_8h.html b/api/0.15/xcm__compat_8h.html new file mode 100644 index 000000000..db561b305 --- /dev/null +++ b/api/0.15/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see io_waiting.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.15/xcm__compat_8h_source.html b/api/0.15/xcm__compat_8h_source.html new file mode 100644 index 000000000..a8f684eeb --- /dev/null +++ b/api/0.15/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    118int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    119 size_t capacity);
    +
    120
    +
    121#ifdef __cplusplus
    +
    122}
    +
    123#endif
    +
    124#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.15/xcm__version_8h.html b/api/0.15/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.15/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.15/xcm__version_8h_source.html b/api/0.15/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.15/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.16/annotated.html b/api/0.16/annotated.html new file mode 100644 index 000000000..175288070 --- /dev/null +++ b/api/0.16/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.16/bc_s.png b/api/0.16/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.16/bc_s.png differ diff --git a/api/0.16/bc_sd.png b/api/0.16/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.16/bc_sd.png differ diff --git a/api/0.16/classes.html b/api/0.16/classes.html new file mode 100644 index 000000000..3500e84ab --- /dev/null +++ b/api/0.16/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.16/closed.png b/api/0.16/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.16/closed.png differ diff --git a/api/0.16/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.16/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..36b47d30f --- /dev/null +++ b/api/0.16/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.16/doc.svg b/api/0.16/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.16/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.16/docd.svg b/api/0.16/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.16/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.16/doxygen.css b/api/0.16/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.16/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.16/doxygen.svg b/api/0.16/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.16/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.16/dynsections.js b/api/0.16/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.16/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.16/files.html b/api/0.16/files.html new file mode 100644 index 000000000..4786b318d --- /dev/null +++ b/api/0.16/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/api/0.16/folderclosed.svg b/api/0.16/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.16/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.16/folderclosedd.svg b/api/0.16/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.16/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.16/folderopen.svg b/api/0.16/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.16/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.16/folderopend.svg b/api/0.16/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.16/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.16/functions.html b/api/0.16/functions.html new file mode 100644 index 000000000..85c9b502c --- /dev/null +++ b/api/0.16/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.16/functions_vars.html b/api/0.16/functions_vars.html new file mode 100644 index 000000000..19934f3ed --- /dev/null +++ b/api/0.16/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.16/globals.html b/api/0.16/globals.html new file mode 100644 index 000000000..6f3c9a9a8 --- /dev/null +++ b/api/0.16/globals.html @@ -0,0 +1,158 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.16/globals_defs.html b/api/0.16/globals_defs.html new file mode 100644 index 000000000..b1a9245a0 --- /dev/null +++ b/api/0.16/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.16/globals_enum.html b/api/0.16/globals_enum.html new file mode 100644 index 000000000..c5dc7fe82 --- /dev/null +++ b/api/0.16/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.16/globals_eval.html b/api/0.16/globals_eval.html new file mode 100644 index 000000000..7931a0750 --- /dev/null +++ b/api/0.16/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.16/globals_func.html b/api/0.16/globals_func.html new file mode 100644 index 000000000..03335a4b6 --- /dev/null +++ b/api/0.16/globals_func.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.16/globals_type.html b/api/0.16/globals_type.html new file mode 100644 index 000000000..7eafa6dab --- /dev/null +++ b/api/0.16/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.16/group__api__version.html b/api/0.16/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.16/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.16/group__lib__version.html b/api/0.16/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.16/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.16/index.html b/api/0.16/index.html new file mode 100644 index 000000000..e9ce3295d --- /dev/null +++ b/api/0.16/index.html @@ -0,0 +1,525 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.16 [API]
    +
    +1.2.0 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    An example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key, from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +TLS Socket Attributes

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/api/0.16/inline_umlgraph_pnghtml.pu b/api/0.16/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/api/0.16/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.16/jquery.js b/api/0.16/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.16/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.16/menu.js b/api/0.16/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.16/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.16/menudata.js b/api/0.16/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/api/0.16/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.16/minus.svg b/api/0.16/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.16/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.16/minusd.svg b/api/0.16/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.16/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.16/nav_f.png b/api/0.16/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.16/nav_f.png differ diff --git a/api/0.16/nav_fd.png b/api/0.16/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.16/nav_fd.png differ diff --git a/api/0.16/nav_g.png b/api/0.16/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.16/nav_g.png differ diff --git a/api/0.16/nav_h.png b/api/0.16/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.16/nav_h.png differ diff --git a/api/0.16/nav_hd.png b/api/0.16/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.16/nav_hd.png differ diff --git a/api/0.16/nb_connect_and_send.png b/api/0.16/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.16/nb_connect_and_send.png differ diff --git a/api/0.16/nb_connect_explicit.png b/api/0.16/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/api/0.16/nb_connect_explicit.png differ diff --git a/api/0.16/nb_delayed_connection_refused.png b/api/0.16/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.16/nb_delayed_connection_refused.png differ diff --git a/api/0.16/nb_flush_buffers_before_close.png b/api/0.16/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.16/nb_flush_buffers_before_close.png differ diff --git a/api/0.16/nb_immediate_connection_refused.png b/api/0.16/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.16/nb_immediate_connection_refused.png differ diff --git a/api/0.16/open.png b/api/0.16/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.16/open.png differ diff --git a/api/0.16/plus.svg b/api/0.16/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.16/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.16/plusd.svg b/api/0.16/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.16/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.16/search/all_0.js b/api/0.16/search/all_0.js new file mode 100644 index 000000000..4c74c64dd --- /dev/null +++ b/api/0.16/search/all_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/api/0.16/search/all_1.js b/api/0.16/search/all_1.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/api/0.16/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/api/0.16/search/all_10.js b/api/0.16/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/api/0.16/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.16/search/all_11.js b/api/0.16/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/api/0.16/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.16/search/all_12.js b/api/0.16/search/all_12.js new file mode 100644 index 000000000..fafb226cf --- /dev/null +++ b/api/0.16/search/all_12.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_3',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_4',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_5',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_6',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.16/search/all_13.js b/api/0.16/search/all_13.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.16/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.16/search/all_14.js b/api/0.16/search/all_14.js new file mode 100644 index 000000000..f24694761 --- /dev/null +++ b/api/0.16/search/all_14.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_2',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_3',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_4',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_5',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_19',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_20',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_23',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_24',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_25',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_26',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_27',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_28',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_29',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_30',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_31',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_32',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_33',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_34',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_35',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_36',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_37',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_38',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_39',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_40',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_41',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_42',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_43',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_44',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_45',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_46',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_47',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_48',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_49',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_50',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_51',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_52',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_53',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_54',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_55',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_56',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_57',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_58',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_59',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_60',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_61',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_62',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_63',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_64',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_65',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_66',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_67',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_68',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_69',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_70',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_71',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_72',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_73',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_74',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_75',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_76',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_77',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_78',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_79',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_80',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_81',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_82',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_83',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.16/search/all_15.js b/api/0.16/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.16/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.16/search/all_16.js b/api/0.16/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/api/0.16/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.16/search/all_2.js b/api/0.16/search/all_2.js new file mode 100644 index 000000000..8b2b3c959 --- /dev/null +++ b/api/0.16/search/all_2.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['close_3',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_6',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_7',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_8',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_9',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_10',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_12',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_13',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_14',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_15',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_16',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/api/0.16/search/all_3.js b/api/0.16/search/all_3.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.16/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.16/search/all_4.js b/api/0.16/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.16/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.16/search/all_5.js b/api/0.16/search/all_5.js new file mode 100644 index 000000000..da16ba1ff --- /dev/null +++ b/api/0.16/search/all_5.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_3',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_5',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.16/search/all_6.js b/api/0.16/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/api/0.16/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.16/search/all_7.js b/api/0.16/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.16/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.16/search/all_8.js b/api/0.16/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/api/0.16/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.16/search/all_9.js b/api/0.16/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/api/0.16/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.16/search/all_a.js b/api/0.16/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/api/0.16/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.16/search/all_b.js b/api/0.16/search/all_b.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/api/0.16/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.16/search/all_c.js b/api/0.16/search/all_c.js new file mode 100644 index 000000000..b09d90c32 --- /dev/null +++ b/api/0.16/search/all_c.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_4',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_7',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.16/search/all_d.js b/api/0.16/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/api/0.16/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.16/search/all_e.js b/api/0.16/search/all_e.js new file mode 100644 index 000000000..8213bfe74 --- /dev/null +++ b/api/0.16/search/all_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['processing_20and_20fork_2',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_3',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_4',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.16/search/all_f.js b/api/0.16/search/all_f.js new file mode 100644 index 000000000..f9f816770 --- /dev/null +++ b/api/0.16/search/all_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['runtime_20certificate_20file_20updates_4',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.16/search/classes_0.js b/api/0.16/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.16/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.16/search/close.svg b/api/0.16/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.16/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.16/search/defines_0.js b/api/0.16/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/api/0.16/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.16/search/enums_0.js b/api/0.16/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.16/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.16/search/enumvalues_0.js b/api/0.16/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.16/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.16/search/files_0.js b/api/0.16/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/api/0.16/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.16/search/functions_0.js b/api/0.16/search/functions_0.js new file mode 100644 index 000000000..347860ce1 --- /dev/null +++ b/api/0.16/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_17',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_18',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_19',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_20',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_21',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_22',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_23',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_24',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_25',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_26',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_27',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_28',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_29',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_30',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_31',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_32',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_33',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_34',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_35',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_36',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_37',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_38',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_39',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_40',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_41',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_42',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_43',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_44',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_45',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_46',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_47',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_48',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_49',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_50',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_51',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_52',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_53',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_54',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.16/search/groups_0.js b/api/0.16/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.16/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.16/search/groups_1.js b/api/0.16/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.16/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.16/search/groups_2.js b/api/0.16/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.16/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.16/search/mag.svg b/api/0.16/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.16/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.16/search/mag_d.svg b/api/0.16/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.16/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.16/search/mag_sel.svg b/api/0.16/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.16/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.16/search/mag_seld.svg b/api/0.16/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.16/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.16/search/pages_0.js b/api/0.16/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.16/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.16/search/pages_1.js b/api/0.16/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.16/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.16/search/pages_2.js b/api/0.16/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.16/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.16/search/pages_3.js b/api/0.16/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.16/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.16/search/search.css b/api/0.16/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.16/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.16/search/search.js b/api/0.16/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.16/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.16/structxcm__addr__ip.html b/api/0.16/structxcm__addr__ip.html new file mode 100644 index 000000000..99db5d362 --- /dev/null +++ b/api/0.16/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.16/sync_off.png b/api/0.16/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.16/sync_off.png differ diff --git a/api/0.16/sync_on.png b/api/0.16/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.16/sync_on.png differ diff --git a/api/0.16/tab_a.png b/api/0.16/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.16/tab_a.png differ diff --git a/api/0.16/tab_ad.png b/api/0.16/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.16/tab_ad.png differ diff --git a/api/0.16/tab_b.png b/api/0.16/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.16/tab_b.png differ diff --git a/api/0.16/tab_bd.png b/api/0.16/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.16/tab_bd.png differ diff --git a/api/0.16/tab_h.png b/api/0.16/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.16/tab_h.png differ diff --git a/api/0.16/tab_hd.png b/api/0.16/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.16/tab_hd.png differ diff --git a/api/0.16/tab_s.png b/api/0.16/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.16/tab_s.png differ diff --git a/api/0.16/tab_sd.png b/api/0.16/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.16/tab_sd.png differ diff --git a/api/0.16/tabs.css b/api/0.16/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.16/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.16/topics.html b/api/0.16/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.16/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.16/xcm_8h.html b/api/0.16/xcm_8h.html new file mode 100644 index 000000000..7159da29d --- /dev/null +++ b/api/0.16/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.16/xcm_8h_source.html b/api/0.16/xcm_8h_source.html new file mode 100644 index 000000000..69a3162e4 --- /dev/null +++ b/api/0.16/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1008#include <errno.h>
    +
    1009#include <stdbool.h>
    +
    1010#include <sys/types.h>
    +
    1011
    +
    1012#include <xcm_attr_map.h>
    +
    1013
    +
    1015#define XCM_NONBLOCK (1<<0)
    +
    1016
    +
    1023struct xcm_socket;
    +
    1024
    +
    1075struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1076
    +
    1098struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1099 const struct xcm_attr_map *attrs);
    +
    1100
    +
    1131struct xcm_socket *xcm_server(const char *local_addr);
    +
    1132
    +
    1148struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1149 const struct xcm_attr_map *attrs);
    +
    1150
    +
    1167int xcm_close(struct xcm_socket *socket);
    +
    1168
    +
    1188void xcm_cleanup(struct xcm_socket *socket);
    +
    1189
    +
    1212struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1213
    +
    1230struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1231 const struct xcm_attr_map *attrs);
    +
    1232
    +
    1254int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1255
    +
    1278int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1279
    +
    1282#define XCM_SO_RECEIVABLE (1<<0)
    +
    1285#define XCM_SO_SENDABLE (1<<1)
    +
    1287#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1288
    +
    1349int xcm_await(struct xcm_socket *socket, int condition);
    +
    1350
    +
    1392int xcm_fd(struct xcm_socket *socket);
    +
    1393
    +
    1434int xcm_finish(struct xcm_socket *socket);
    +
    1435
    +
    1476int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1477
    +
    1492bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1493
    +
    1510const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1511
    +
    1526const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1527
    +
    1528#include <xcm_compat.h>
    +
    1529
    +
    1530#ifdef __cplusplus
    +
    1531}
    +
    1532#endif
    +
    1533#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.16/xcm__addr_8h.html b/api/0.16/xcm__addr_8h.html new file mode 100644 index 000000000..c0f1bb724 --- /dev/null +++ b/api/0.16/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/api/0.16/xcm__addr_8h_source.html b/api/0.16/xcm__addr_8h_source.html new file mode 100644 index 000000000..b4551701a --- /dev/null +++ b/api/0.16/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.16/xcm__attr_8h.html b/api/0.16/xcm__attr_8h.html new file mode 100644 index 000000000..9d24b1546 --- /dev/null +++ b/api/0.16/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.16/xcm__attr_8h_source.html b/api/0.16/xcm__attr_8h_source.html new file mode 100644 index 000000000..832520592 --- /dev/null +++ b/api/0.16/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.16/xcm__attr__map_8h.html b/api/0.16/xcm__attr__map_8h.html new file mode 100644 index 000000000..67324c27f --- /dev/null +++ b/api/0.16/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.16/xcm__attr__map_8h_source.html b/api/0.16/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..cbf592529 --- /dev/null +++ b/api/0.16/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.16/xcm__attr__types_8h.html b/api/0.16/xcm__attr__types_8h.html new file mode 100644 index 000000000..2c7508afb --- /dev/null +++ b/api/0.16/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.16/xcm__attr__types_8h_source.html b/api/0.16/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..e088e321e --- /dev/null +++ b/api/0.16/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.16/xcm__compat_8h.html b/api/0.16/xcm__compat_8h.html new file mode 100644 index 000000000..c6bf90a0f --- /dev/null +++ b/api/0.16/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.16/xcm__compat_8h_source.html b/api/0.16/xcm__compat_8h_source.html new file mode 100644 index 000000000..e21e8cf5b --- /dev/null +++ b/api/0.16/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.16/xcm__version_8h.html b/api/0.16/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.16/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.16/xcm__version_8h_source.html b/api/0.16/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.16/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.17/annotated.html b/api/0.17/annotated.html new file mode 100644 index 000000000..a9bb363ac --- /dev/null +++ b/api/0.17/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.17/bc_s.png b/api/0.17/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.17/bc_s.png differ diff --git a/api/0.17/bc_sd.png b/api/0.17/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.17/bc_sd.png differ diff --git a/api/0.17/classes.html b/api/0.17/classes.html new file mode 100644 index 000000000..4f6819176 --- /dev/null +++ b/api/0.17/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.17/closed.png b/api/0.17/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.17/closed.png differ diff --git a/api/0.17/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.17/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..29fcdc143 --- /dev/null +++ b/api/0.17/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.17/doc.svg b/api/0.17/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.17/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.17/docd.svg b/api/0.17/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.17/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.17/doxygen.css b/api/0.17/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.17/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.17/doxygen.svg b/api/0.17/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.17/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.17/dynsections.js b/api/0.17/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.17/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.17/files.html b/api/0.17/files.html new file mode 100644 index 000000000..69e4ea507 --- /dev/null +++ b/api/0.17/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/api/0.17/folderclosed.svg b/api/0.17/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.17/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.17/folderclosedd.svg b/api/0.17/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.17/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.17/folderopen.svg b/api/0.17/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.17/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.17/folderopend.svg b/api/0.17/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.17/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.17/functions.html b/api/0.17/functions.html new file mode 100644 index 000000000..48ffb5095 --- /dev/null +++ b/api/0.17/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.17/functions_vars.html b/api/0.17/functions_vars.html new file mode 100644 index 000000000..f3dc5035c --- /dev/null +++ b/api/0.17/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.17/globals.html b/api/0.17/globals.html new file mode 100644 index 000000000..7676ad344 --- /dev/null +++ b/api/0.17/globals.html @@ -0,0 +1,158 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.17/globals_defs.html b/api/0.17/globals_defs.html new file mode 100644 index 000000000..0ef1d43a0 --- /dev/null +++ b/api/0.17/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.17/globals_enum.html b/api/0.17/globals_enum.html new file mode 100644 index 000000000..49cdf22c3 --- /dev/null +++ b/api/0.17/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.17/globals_eval.html b/api/0.17/globals_eval.html new file mode 100644 index 000000000..3225f4d11 --- /dev/null +++ b/api/0.17/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.17/globals_func.html b/api/0.17/globals_func.html new file mode 100644 index 000000000..dd16c334c --- /dev/null +++ b/api/0.17/globals_func.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.17/globals_type.html b/api/0.17/globals_type.html new file mode 100644 index 000000000..e413cc3da --- /dev/null +++ b/api/0.17/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.17/group__api__version.html b/api/0.17/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.17/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.17/group__lib__version.html b/api/0.17/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.17/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.17/index.html b/api/0.17/index.html new file mode 100644 index 000000000..cbbb20f30 --- /dev/null +++ b/api/0.17/index.html @@ -0,0 +1,560 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.17 [API]
    +
    +1.3.0 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    An example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often known as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/api/0.17/inline_umlgraph_pnghtml.pu b/api/0.17/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/api/0.17/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.17/jquery.js b/api/0.17/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.17/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.17/menu.js b/api/0.17/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.17/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.17/menudata.js b/api/0.17/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/api/0.17/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.17/minus.svg b/api/0.17/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.17/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.17/minusd.svg b/api/0.17/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.17/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.17/nav_f.png b/api/0.17/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.17/nav_f.png differ diff --git a/api/0.17/nav_fd.png b/api/0.17/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.17/nav_fd.png differ diff --git a/api/0.17/nav_g.png b/api/0.17/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.17/nav_g.png differ diff --git a/api/0.17/nav_h.png b/api/0.17/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.17/nav_h.png differ diff --git a/api/0.17/nav_hd.png b/api/0.17/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.17/nav_hd.png differ diff --git a/api/0.17/nb_connect_and_send.png b/api/0.17/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.17/nb_connect_and_send.png differ diff --git a/api/0.17/nb_connect_explicit.png b/api/0.17/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/api/0.17/nb_connect_explicit.png differ diff --git a/api/0.17/nb_delayed_connection_refused.png b/api/0.17/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.17/nb_delayed_connection_refused.png differ diff --git a/api/0.17/nb_flush_buffers_before_close.png b/api/0.17/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.17/nb_flush_buffers_before_close.png differ diff --git a/api/0.17/nb_immediate_connection_refused.png b/api/0.17/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.17/nb_immediate_connection_refused.png differ diff --git a/api/0.17/open.png b/api/0.17/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.17/open.png differ diff --git a/api/0.17/plus.svg b/api/0.17/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.17/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.17/plusd.svg b/api/0.17/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.17/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.17/search/all_0.js b/api/0.17/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.17/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.17/search/all_1.js b/api/0.17/search/all_1.js new file mode 100644 index 000000000..ee46bfe7e --- /dev/null +++ b/api/0.17/search/all_1.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_14',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.17/search/all_10.js b/api/0.17/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/api/0.17/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.17/search/all_11.js b/api/0.17/search/all_11.js new file mode 100644 index 000000000..8993846a2 --- /dev/null +++ b/api/0.17/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.17/search/all_12.js b/api/0.17/search/all_12.js new file mode 100644 index 000000000..15d6200c6 --- /dev/null +++ b/api/0.17/search/all_12.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20socket_20attributes_4',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_5',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_6',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_7',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_8',['Transports',['../index.html#transports',1,'']]], + ['type_9',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.17/search/all_13.js b/api/0.17/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.17/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.17/search/all_14.js b/api/0.17/search/all_14.js new file mode 100644 index 000000000..d087c6b23 --- /dev/null +++ b/api/0.17/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.17/search/all_15.js b/api/0.17/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.17/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.17/search/all_16.js b/api/0.17/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/api/0.17/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.17/search/all_2.js b/api/0.17/search/all_2.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/api/0.17/search/all_2.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/api/0.17/search/all_3.js b/api/0.17/search/all_3.js new file mode 100644 index 000000000..927e04535 --- /dev/null +++ b/api/0.17/search/all_3.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['close_3',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_5',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_6',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_7',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_8',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_9',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_10',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_11',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_12',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_13',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_14',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_15',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_16',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_17',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/api/0.17/search/all_4.js b/api/0.17/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.17/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.17/search/all_5.js b/api/0.17/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.17/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.17/search/all_6.js b/api/0.17/search/all_6.js new file mode 100644 index 000000000..da16ba1ff --- /dev/null +++ b/api/0.17/search/all_6.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_3',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_5',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.17/search/all_7.js b/api/0.17/search/all_7.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/api/0.17/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.17/search/all_8.js b/api/0.17/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.17/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.17/search/all_9.js b/api/0.17/search/all_9.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/api/0.17/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.17/search/all_a.js b/api/0.17/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/api/0.17/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.17/search/all_b.js b/api/0.17/search/all_b.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/api/0.17/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.17/search/all_c.js b/api/0.17/search/all_c.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/api/0.17/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.17/search/all_d.js b/api/0.17/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/api/0.17/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.17/search/all_e.js b/api/0.17/search/all_e.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/api/0.17/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.17/search/all_f.js b/api/0.17/search/all_f.js new file mode 100644 index 000000000..8213bfe74 --- /dev/null +++ b/api/0.17/search/all_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['processing_20and_20fork_2',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_3',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_4',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.17/search/classes_0.js b/api/0.17/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.17/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.17/search/close.svg b/api/0.17/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.17/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.17/search/defines_0.js b/api/0.17/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/api/0.17/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.17/search/enums_0.js b/api/0.17/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.17/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.17/search/enumvalues_0.js b/api/0.17/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.17/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.17/search/files_0.js b/api/0.17/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/api/0.17/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.17/search/functions_0.js b/api/0.17/search/functions_0.js new file mode 100644 index 000000000..347860ce1 --- /dev/null +++ b/api/0.17/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_17',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_18',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_19',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_20',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_21',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_22',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_23',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_24',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_25',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_26',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_27',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_28',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_29',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_30',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_31',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_32',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_33',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_34',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_35',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_36',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_37',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_38',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_39',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_40',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_41',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_42',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_43',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_44',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_45',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_46',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_47',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_48',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_49',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_50',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_51',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_52',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_53',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_54',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.17/search/groups_0.js b/api/0.17/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.17/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.17/search/groups_1.js b/api/0.17/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.17/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.17/search/groups_2.js b/api/0.17/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.17/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.17/search/mag.svg b/api/0.17/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.17/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.17/search/mag_d.svg b/api/0.17/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.17/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.17/search/mag_sel.svg b/api/0.17/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.17/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.17/search/mag_seld.svg b/api/0.17/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.17/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.17/search/pages_0.js b/api/0.17/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.17/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.17/search/pages_1.js b/api/0.17/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.17/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.17/search/pages_2.js b/api/0.17/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.17/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.17/search/pages_3.js b/api/0.17/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.17/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.17/search/search.css b/api/0.17/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.17/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.17/search/search.js b/api/0.17/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.17/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.17/structxcm__addr__ip.html b/api/0.17/structxcm__addr__ip.html new file mode 100644 index 000000000..38a4db069 --- /dev/null +++ b/api/0.17/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.17/sync_off.png b/api/0.17/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.17/sync_off.png differ diff --git a/api/0.17/sync_on.png b/api/0.17/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.17/sync_on.png differ diff --git a/api/0.17/tab_a.png b/api/0.17/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.17/tab_a.png differ diff --git a/api/0.17/tab_ad.png b/api/0.17/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.17/tab_ad.png differ diff --git a/api/0.17/tab_b.png b/api/0.17/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.17/tab_b.png differ diff --git a/api/0.17/tab_bd.png b/api/0.17/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.17/tab_bd.png differ diff --git a/api/0.17/tab_h.png b/api/0.17/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.17/tab_h.png differ diff --git a/api/0.17/tab_hd.png b/api/0.17/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.17/tab_hd.png differ diff --git a/api/0.17/tab_s.png b/api/0.17/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.17/tab_s.png differ diff --git a/api/0.17/tab_sd.png b/api/0.17/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.17/tab_sd.png differ diff --git a/api/0.17/tabs.css b/api/0.17/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.17/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.17/topics.html b/api/0.17/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.17/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.17/xcm_8h.html b/api/0.17/xcm_8h.html new file mode 100644 index 000000000..eb018eb7f --- /dev/null +++ b/api/0.17/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.17/xcm_8h_source.html b/api/0.17/xcm_8h_source.html new file mode 100644 index 000000000..3d53efc95 --- /dev/null +++ b/api/0.17/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1099#include <errno.h>
    +
    1100#include <stdbool.h>
    +
    1101#include <sys/types.h>
    +
    1102
    +
    1103#include <xcm_attr_map.h>
    +
    1104
    +
    1106#define XCM_NONBLOCK (1<<0)
    +
    1107
    +
    1114struct xcm_socket;
    +
    1115
    +
    1166struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1167
    +
    1189struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1190 const struct xcm_attr_map *attrs);
    +
    1191
    +
    1222struct xcm_socket *xcm_server(const char *local_addr);
    +
    1223
    +
    1239struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1240 const struct xcm_attr_map *attrs);
    +
    1241
    +
    1258int xcm_close(struct xcm_socket *socket);
    +
    1259
    +
    1279void xcm_cleanup(struct xcm_socket *socket);
    +
    1280
    +
    1303struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1304
    +
    1321struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1322 const struct xcm_attr_map *attrs);
    +
    1323
    +
    1345int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1346
    +
    1369int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1370
    +
    1373#define XCM_SO_RECEIVABLE (1<<0)
    +
    1376#define XCM_SO_SENDABLE (1<<1)
    +
    1378#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1379
    +
    1440int xcm_await(struct xcm_socket *socket, int condition);
    +
    1441
    +
    1483int xcm_fd(struct xcm_socket *socket);
    +
    1484
    +
    1525int xcm_finish(struct xcm_socket *socket);
    +
    1526
    +
    1567int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1568
    +
    1583bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1584
    +
    1601const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1602
    +
    1617const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1618
    +
    1619#include <xcm_compat.h>
    +
    1620
    +
    1621#ifdef __cplusplus
    +
    1622}
    +
    1623#endif
    +
    1624#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.17/xcm__addr_8h.html b/api/0.17/xcm__addr_8h.html new file mode 100644 index 000000000..cea78c830 --- /dev/null +++ b/api/0.17/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/api/0.17/xcm__addr_8h_source.html b/api/0.17/xcm__addr_8h_source.html new file mode 100644 index 000000000..19f4ac189 --- /dev/null +++ b/api/0.17/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.17/xcm__attr_8h.html b/api/0.17/xcm__attr_8h.html new file mode 100644 index 000000000..e0bca8243 --- /dev/null +++ b/api/0.17/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.17/xcm__attr_8h_source.html b/api/0.17/xcm__attr_8h_source.html new file mode 100644 index 000000000..03f4db0e3 --- /dev/null +++ b/api/0.17/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.17/xcm__attr__map_8h.html b/api/0.17/xcm__attr__map_8h.html new file mode 100644 index 000000000..0ec720542 --- /dev/null +++ b/api/0.17/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.17/xcm__attr__map_8h_source.html b/api/0.17/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..b60b65647 --- /dev/null +++ b/api/0.17/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.17/xcm__attr__types_8h.html b/api/0.17/xcm__attr__types_8h.html new file mode 100644 index 000000000..5301d6534 --- /dev/null +++ b/api/0.17/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.17/xcm__attr__types_8h_source.html b/api/0.17/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..ac6d9d38e --- /dev/null +++ b/api/0.17/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.17/xcm__compat_8h.html b/api/0.17/xcm__compat_8h.html new file mode 100644 index 000000000..7c6fffded --- /dev/null +++ b/api/0.17/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.17/xcm__compat_8h_source.html b/api/0.17/xcm__compat_8h_source.html new file mode 100644 index 000000000..30c6ed7c6 --- /dev/null +++ b/api/0.17/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.17/xcm__version_8h.html b/api/0.17/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.17/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.17/xcm__version_8h_source.html b/api/0.17/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.17/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.18/annotated.html b/api/0.18/annotated.html new file mode 100644 index 000000000..3f71c205b --- /dev/null +++ b/api/0.18/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.18/bc_s.png b/api/0.18/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.18/bc_s.png differ diff --git a/api/0.18/bc_sd.png b/api/0.18/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.18/bc_sd.png differ diff --git a/api/0.18/classes.html b/api/0.18/classes.html new file mode 100644 index 000000000..a87216ea8 --- /dev/null +++ b/api/0.18/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.18/closed.png b/api/0.18/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.18/closed.png differ diff --git a/api/0.18/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.18/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..1a3de722c --- /dev/null +++ b/api/0.18/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.18/doc.svg b/api/0.18/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.18/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.18/docd.svg b/api/0.18/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.18/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.18/doxygen.css b/api/0.18/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.18/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.18/doxygen.svg b/api/0.18/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.18/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.18/dynsections.js b/api/0.18/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.18/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.18/files.html b/api/0.18/files.html new file mode 100644 index 000000000..a0a847a6b --- /dev/null +++ b/api/0.18/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/api/0.18/folderclosed.svg b/api/0.18/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.18/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.18/folderclosedd.svg b/api/0.18/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.18/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.18/folderopen.svg b/api/0.18/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.18/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.18/folderopend.svg b/api/0.18/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.18/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.18/functions.html b/api/0.18/functions.html new file mode 100644 index 000000000..8966e4e80 --- /dev/null +++ b/api/0.18/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.18/functions_vars.html b/api/0.18/functions_vars.html new file mode 100644 index 000000000..dc06c3252 --- /dev/null +++ b/api/0.18/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.18/globals.html b/api/0.18/globals.html new file mode 100644 index 000000000..31f9995ed --- /dev/null +++ b/api/0.18/globals.html @@ -0,0 +1,161 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.18/globals_defs.html b/api/0.18/globals_defs.html new file mode 100644 index 000000000..480c495b8 --- /dev/null +++ b/api/0.18/globals_defs.html @@ -0,0 +1,94 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.18/globals_enum.html b/api/0.18/globals_enum.html new file mode 100644 index 000000000..016e7787c --- /dev/null +++ b/api/0.18/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.18/globals_eval.html b/api/0.18/globals_eval.html new file mode 100644 index 000000000..b38c7ab7a --- /dev/null +++ b/api/0.18/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.18/globals_func.html b/api/0.18/globals_func.html new file mode 100644 index 000000000..c9e1e20c5 --- /dev/null +++ b/api/0.18/globals_func.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.18/globals_type.html b/api/0.18/globals_type.html new file mode 100644 index 000000000..4584febbd --- /dev/null +++ b/api/0.18/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.18/group__api__version.html b/api/0.18/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.18/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.18/group__lib__version.html b/api/0.18/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.18/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.18/index.html b/api/0.18/index.html new file mode 100644 index 000000000..27166684a --- /dev/null +++ b/api/0.18/index.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.18 [API]
    +
    +1.4.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    IPv6 link local addresses are not supported.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default is 3 s.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport uses only TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header nor anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/api/0.18/inline_umlgraph_pnghtml.pu b/api/0.18/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/api/0.18/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.18/jquery.js b/api/0.18/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.18/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.18/menu.js b/api/0.18/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.18/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.18/menudata.js b/api/0.18/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/api/0.18/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.18/minus.svg b/api/0.18/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.18/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.18/minusd.svg b/api/0.18/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.18/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.18/nav_f.png b/api/0.18/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.18/nav_f.png differ diff --git a/api/0.18/nav_fd.png b/api/0.18/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.18/nav_fd.png differ diff --git a/api/0.18/nav_g.png b/api/0.18/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.18/nav_g.png differ diff --git a/api/0.18/nav_h.png b/api/0.18/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.18/nav_h.png differ diff --git a/api/0.18/nav_hd.png b/api/0.18/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.18/nav_hd.png differ diff --git a/api/0.18/nb_connect_and_send.png b/api/0.18/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.18/nb_connect_and_send.png differ diff --git a/api/0.18/nb_connect_explicit.png b/api/0.18/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/api/0.18/nb_connect_explicit.png differ diff --git a/api/0.18/nb_delayed_connection_refused.png b/api/0.18/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.18/nb_delayed_connection_refused.png differ diff --git a/api/0.18/nb_flush_buffers_before_close.png b/api/0.18/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.18/nb_flush_buffers_before_close.png differ diff --git a/api/0.18/nb_immediate_connection_refused.png b/api/0.18/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.18/nb_immediate_connection_refused.png differ diff --git a/api/0.18/open.png b/api/0.18/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.18/open.png differ diff --git a/api/0.18/plus.svg b/api/0.18/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.18/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.18/plusd.svg b/api/0.18/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.18/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.18/search/all_0.js b/api/0.18/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.18/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.18/search/all_1.js b/api/0.18/search/all_1.js new file mode 100644 index 000000000..c795d6a1e --- /dev/null +++ b/api/0.18/search/all_1.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_5',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_9',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_10',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_12',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_14',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_15',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_16',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.18/search/all_10.js b/api/0.18/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/api/0.18/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.18/search/all_11.js b/api/0.18/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/api/0.18/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.18/search/all_12.js b/api/0.18/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/api/0.18/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.18/search/all_13.js b/api/0.18/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.18/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.18/search/all_14.js b/api/0.18/search/all_14.js new file mode 100644 index 000000000..062780300 --- /dev/null +++ b/api/0.18/search/all_14.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_1',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.18/search/all_15.js b/api/0.18/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.18/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.18/search/all_16.js b/api/0.18/search/all_16.js new file mode 100644 index 000000000..fe9fb8005 --- /dev/null +++ b/api/0.18/search/all_16.js @@ -0,0 +1,91 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_31',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_32',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_33',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_34',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_35',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_36',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_37',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_38',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_39',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_40',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_41',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_42',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_43',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_44',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_45',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_46',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_47',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_48',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_49',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_50',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_51',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_52',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_53',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_54',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_55',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_56',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_57',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_58',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_59',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_60',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_61',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_62',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_63',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_64',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_65',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_66',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_67',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_68',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_69',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_70',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_71',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_72',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_73',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_74',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_75',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_76',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_77',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_78',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_79',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_80',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_81',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_82',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_83',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_84',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_85',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_86',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_87',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.18/search/all_2.js b/api/0.18/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/api/0.18/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/0.18/search/all_3.js b/api/0.18/search/all_3.js new file mode 100644 index 000000000..a18dc9dfa --- /dev/null +++ b/api/0.18/search/all_3.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['ciphers_3',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_4',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_5',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_7',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_8',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_9',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_10',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_11',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_12',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_14',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_15',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_16',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_17',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_18',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/0.18/search/all_4.js b/api/0.18/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.18/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.18/search/all_5.js b/api/0.18/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.18/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.18/search/all_6.js b/api/0.18/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/api/0.18/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.18/search/all_7.js b/api/0.18/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/0.18/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.18/search/all_8.js b/api/0.18/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.18/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.18/search/all_9.js b/api/0.18/search/all_9.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/api/0.18/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.18/search/all_a.js b/api/0.18/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/api/0.18/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.18/search/all_b.js b/api/0.18/search/all_b.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/api/0.18/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.18/search/all_c.js b/api/0.18/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/0.18/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.18/search/all_d.js b/api/0.18/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/api/0.18/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.18/search/all_e.js b/api/0.18/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/0.18/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.18/search/all_f.js b/api/0.18/search/all_f.js new file mode 100644 index 000000000..47f4c12e6 --- /dev/null +++ b/api/0.18/search/all_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['processing_20and_20fork_2',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_3',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_4',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.18/search/classes_0.js b/api/0.18/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.18/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.18/search/close.svg b/api/0.18/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.18/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.18/search/defines_0.js b/api/0.18/search/defines_0.js new file mode 100644 index 000000000..b435664ff --- /dev/null +++ b/api/0.18/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.18/search/enums_0.js b/api/0.18/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.18/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.18/search/enumvalues_0.js b/api/0.18/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.18/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.18/search/files_0.js b/api/0.18/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/api/0.18/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.18/search/functions_0.js b/api/0.18/search/functions_0.js new file mode 100644 index 000000000..5a4a82e55 --- /dev/null +++ b/api/0.18/search/functions_0.js @@ -0,0 +1,61 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_23',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_24',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_25',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_26',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_27',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_28',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_29',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_30',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_31',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_32',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_33',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_34',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_35',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_36',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_37',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_38',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_39',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_40',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_41',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_42',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_43',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_44',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_45',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_46',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_47',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_48',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_49',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_50',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_51',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_52',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_53',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_54',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_55',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_56',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_57',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.18/search/groups_0.js b/api/0.18/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.18/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.18/search/groups_1.js b/api/0.18/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.18/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.18/search/groups_2.js b/api/0.18/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.18/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.18/search/mag.svg b/api/0.18/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.18/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.18/search/mag_d.svg b/api/0.18/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.18/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.18/search/mag_sel.svg b/api/0.18/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.18/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.18/search/mag_seld.svg b/api/0.18/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.18/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.18/search/pages_0.js b/api/0.18/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.18/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.18/search/pages_1.js b/api/0.18/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.18/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.18/search/pages_2.js b/api/0.18/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.18/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.18/search/pages_3.js b/api/0.18/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.18/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.18/search/search.css b/api/0.18/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.18/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.18/search/search.js b/api/0.18/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.18/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.18/structxcm__addr__ip.html b/api/0.18/structxcm__addr__ip.html new file mode 100644 index 000000000..3e378ce1a --- /dev/null +++ b/api/0.18/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.18/sync_off.png b/api/0.18/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.18/sync_off.png differ diff --git a/api/0.18/sync_on.png b/api/0.18/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.18/sync_on.png differ diff --git a/api/0.18/tab_a.png b/api/0.18/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.18/tab_a.png differ diff --git a/api/0.18/tab_ad.png b/api/0.18/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.18/tab_ad.png differ diff --git a/api/0.18/tab_b.png b/api/0.18/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.18/tab_b.png differ diff --git a/api/0.18/tab_bd.png b/api/0.18/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.18/tab_bd.png differ diff --git a/api/0.18/tab_h.png b/api/0.18/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.18/tab_h.png differ diff --git a/api/0.18/tab_hd.png b/api/0.18/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.18/tab_hd.png differ diff --git a/api/0.18/tab_s.png b/api/0.18/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.18/tab_s.png differ diff --git a/api/0.18/tab_sd.png b/api/0.18/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.18/tab_sd.png differ diff --git a/api/0.18/tabs.css b/api/0.18/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.18/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.18/topics.html b/api/0.18/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.18/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.18/xcm_8h.html b/api/0.18/xcm_8h.html new file mode 100644 index 000000000..77ebc18ef --- /dev/null +++ b/api/0.18/xcm_8h.html @@ -0,0 +1,914 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.18/xcm_8h_source.html b/api/0.18/xcm_8h_source.html new file mode 100644 index 000000000..047b5f154 --- /dev/null +++ b/api/0.18/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1223#include <errno.h>
    +
    1224#include <stdbool.h>
    +
    1225#include <sys/types.h>
    +
    1226
    +
    1227#include <xcm_attr_map.h>
    +
    1228
    +
    1230#define XCM_NONBLOCK (1<<0)
    +
    1231
    +
    1238struct xcm_socket;
    +
    1239
    +
    1294struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1295
    +
    1317struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1318 const struct xcm_attr_map *attrs);
    +
    1319
    +
    1354struct xcm_socket *xcm_server(const char *local_addr);
    +
    1355
    +
    1371struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1372 const struct xcm_attr_map *attrs);
    +
    1373
    +
    1390int xcm_close(struct xcm_socket *socket);
    +
    1391
    +
    1411void xcm_cleanup(struct xcm_socket *socket);
    +
    1412
    +
    1435struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1436
    +
    1453struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1454 const struct xcm_attr_map *attrs);
    +
    1455
    +
    1478int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1479
    +
    1503int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1504
    +
    1507#define XCM_SO_RECEIVABLE (1<<0)
    +
    1510#define XCM_SO_SENDABLE (1<<1)
    +
    1512#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1513
    +
    1574int xcm_await(struct xcm_socket *socket, int condition);
    +
    1575
    +
    1617int xcm_fd(struct xcm_socket *socket);
    +
    1618
    +
    1659int xcm_finish(struct xcm_socket *socket);
    +
    1660
    +
    1701int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1702
    +
    1717bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1718
    +
    1735const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1736
    +
    1751const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1752
    +
    1753#include <xcm_compat.h>
    +
    1754
    +
    1755#ifdef __cplusplus
    +
    1756}
    +
    1757#endif
    +
    1758#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.18/xcm__addr_8h.html b/api/0.18/xcm__addr_8h.html new file mode 100644 index 000000000..498eea396 --- /dev/null +++ b/api/0.18/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/0.18/xcm__addr_8h_source.html b/api/0.18/xcm__addr_8h_source.html new file mode 100644 index 000000000..2539963e6 --- /dev/null +++ b/api/0.18/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.18/xcm__attr_8h.html b/api/0.18/xcm__attr_8h.html new file mode 100644 index 000000000..7fa85e2ef --- /dev/null +++ b/api/0.18/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.18/xcm__attr_8h_source.html b/api/0.18/xcm__attr_8h_source.html new file mode 100644 index 000000000..9cad32c03 --- /dev/null +++ b/api/0.18/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.18/xcm__attr__map_8h.html b/api/0.18/xcm__attr__map_8h.html new file mode 100644 index 000000000..471b1b072 --- /dev/null +++ b/api/0.18/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.18/xcm__attr__map_8h_source.html b/api/0.18/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..d0eb53f2d --- /dev/null +++ b/api/0.18/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.18/xcm__attr__types_8h.html b/api/0.18/xcm__attr__types_8h.html new file mode 100644 index 000000000..aa9e8253d --- /dev/null +++ b/api/0.18/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.18/xcm__attr__types_8h_source.html b/api/0.18/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..61af1590f --- /dev/null +++ b/api/0.18/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.18/xcm__compat_8h.html b/api/0.18/xcm__compat_8h.html new file mode 100644 index 000000000..1d3e3f5f6 --- /dev/null +++ b/api/0.18/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.18/xcm__compat_8h_source.html b/api/0.18/xcm__compat_8h_source.html new file mode 100644 index 000000000..093d011be --- /dev/null +++ b/api/0.18/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.18/xcm__version_8h.html b/api/0.18/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.18/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.18/xcm__version_8h_source.html b/api/0.18/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.18/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.19/annotated.html b/api/0.19/annotated.html new file mode 100644 index 000000000..9e9d118bd --- /dev/null +++ b/api/0.19/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.19/bc_s.png b/api/0.19/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.19/bc_s.png differ diff --git a/api/0.19/bc_sd.png b/api/0.19/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.19/bc_sd.png differ diff --git a/api/0.19/classes.html b/api/0.19/classes.html new file mode 100644 index 000000000..620d7f2d8 --- /dev/null +++ b/api/0.19/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.19/closed.png b/api/0.19/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.19/closed.png differ diff --git a/api/0.19/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.19/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..31c017c0b --- /dev/null +++ b/api/0.19/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/api/0.19/doc.svg b/api/0.19/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.19/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.19/docd.svg b/api/0.19/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.19/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.19/doxygen.css b/api/0.19/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.19/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.19/doxygen.svg b/api/0.19/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.19/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.19/dynsections.js b/api/0.19/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.19/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.19/files.html b/api/0.19/files.html new file mode 100644 index 000000000..503bdf2ee --- /dev/null +++ b/api/0.19/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/api/0.19/folderclosed.svg b/api/0.19/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.19/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.19/folderclosedd.svg b/api/0.19/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.19/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.19/folderopen.svg b/api/0.19/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.19/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.19/folderopend.svg b/api/0.19/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.19/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.19/functions.html b/api/0.19/functions.html new file mode 100644 index 000000000..8b6506a7a --- /dev/null +++ b/api/0.19/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.19/functions_vars.html b/api/0.19/functions_vars.html new file mode 100644 index 000000000..71a2d8667 --- /dev/null +++ b/api/0.19/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.19/globals.html b/api/0.19/globals.html new file mode 100644 index 000000000..19b2e7241 --- /dev/null +++ b/api/0.19/globals.html @@ -0,0 +1,162 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.19/globals_defs.html b/api/0.19/globals_defs.html new file mode 100644 index 000000000..0a947796d --- /dev/null +++ b/api/0.19/globals_defs.html @@ -0,0 +1,94 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.19/globals_enum.html b/api/0.19/globals_enum.html new file mode 100644 index 000000000..457a948f3 --- /dev/null +++ b/api/0.19/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.19/globals_eval.html b/api/0.19/globals_eval.html new file mode 100644 index 000000000..276e13ddc --- /dev/null +++ b/api/0.19/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.19/globals_func.html b/api/0.19/globals_func.html new file mode 100644 index 000000000..831018416 --- /dev/null +++ b/api/0.19/globals_func.html @@ -0,0 +1,141 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.19/globals_type.html b/api/0.19/globals_type.html new file mode 100644 index 000000000..78e87bf4f --- /dev/null +++ b/api/0.19/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.19/group__api__version.html b/api/0.19/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.19/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.19/group__lib__version.html b/api/0.19/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.19/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.19/index.html b/api/0.19/index.html new file mode 100644 index 000000000..abc1f9282 --- /dev/null +++ b/api/0.19/index.html @@ -0,0 +1,622 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.19 [API]
    +
    +1.4.1 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    IPv6 link local addresses are not supported.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +
    +
    + + + + diff --git a/api/0.19/inline_umlgraph_pnghtml.pu b/api/0.19/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/api/0.19/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.19/jquery.js b/api/0.19/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.19/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.19/menu.js b/api/0.19/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.19/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.19/menudata.js b/api/0.19/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/api/0.19/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.19/minus.svg b/api/0.19/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.19/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.19/minusd.svg b/api/0.19/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.19/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.19/nav_f.png b/api/0.19/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.19/nav_f.png differ diff --git a/api/0.19/nav_fd.png b/api/0.19/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.19/nav_fd.png differ diff --git a/api/0.19/nav_g.png b/api/0.19/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.19/nav_g.png differ diff --git a/api/0.19/nav_h.png b/api/0.19/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.19/nav_h.png differ diff --git a/api/0.19/nav_hd.png b/api/0.19/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.19/nav_hd.png differ diff --git a/api/0.19/nb_connect_and_send.png b/api/0.19/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.19/nb_connect_and_send.png differ diff --git a/api/0.19/nb_connect_explicit.png b/api/0.19/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/api/0.19/nb_connect_explicit.png differ diff --git a/api/0.19/nb_delayed_connection_refused.png b/api/0.19/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.19/nb_delayed_connection_refused.png differ diff --git a/api/0.19/nb_flush_buffers_before_close.png b/api/0.19/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.19/nb_flush_buffers_before_close.png differ diff --git a/api/0.19/nb_immediate_connection_refused.png b/api/0.19/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.19/nb_immediate_connection_refused.png differ diff --git a/api/0.19/open.png b/api/0.19/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.19/open.png differ diff --git a/api/0.19/plus.svg b/api/0.19/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.19/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.19/plusd.svg b/api/0.19/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.19/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.19/search/all_0.js b/api/0.19/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.19/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.19/search/all_1.js b/api/0.19/search/all_1.js new file mode 100644 index 000000000..a0e0a805e --- /dev/null +++ b/api/0.19/search/all_1.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_5',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_9',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_10',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_12',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_14',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_15',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_16',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_17',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.19/search/all_10.js b/api/0.19/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/api/0.19/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.19/search/all_11.js b/api/0.19/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/api/0.19/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.19/search/all_12.js b/api/0.19/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/api/0.19/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.19/search/all_13.js b/api/0.19/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.19/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.19/search/all_14.js b/api/0.19/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/api/0.19/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.19/search/all_15.js b/api/0.19/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.19/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.19/search/all_16.js b/api/0.19/search/all_16.js new file mode 100644 index 000000000..bd5bbb135 --- /dev/null +++ b/api/0.19/search/all_16.js @@ -0,0 +1,92 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_88',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.19/search/all_2.js b/api/0.19/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/api/0.19/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/0.19/search/all_3.js b/api/0.19/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/api/0.19/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/0.19/search/all_4.js b/api/0.19/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.19/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.19/search/all_5.js b/api/0.19/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.19/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.19/search/all_6.js b/api/0.19/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/api/0.19/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.19/search/all_7.js b/api/0.19/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/0.19/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.19/search/all_8.js b/api/0.19/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.19/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.19/search/all_9.js b/api/0.19/search/all_9.js new file mode 100644 index 000000000..20917f6b6 --- /dev/null +++ b/api/0.19/search/all_9.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.19/search/all_a.js b/api/0.19/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/api/0.19/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.19/search/all_b.js b/api/0.19/search/all_b.js new file mode 100644 index 000000000..d9810deec --- /dev/null +++ b/api/0.19/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.19/search/all_c.js b/api/0.19/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/0.19/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.19/search/all_d.js b/api/0.19/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/api/0.19/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.19/search/all_e.js b/api/0.19/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/0.19/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.19/search/all_f.js b/api/0.19/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/0.19/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.19/search/classes_0.js b/api/0.19/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.19/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.19/search/close.svg b/api/0.19/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.19/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.19/search/defines_0.js b/api/0.19/search/defines_0.js new file mode 100644 index 000000000..b435664ff --- /dev/null +++ b/api/0.19/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.19/search/enums_0.js b/api/0.19/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.19/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.19/search/enumvalues_0.js b/api/0.19/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.19/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.19/search/files_0.js b/api/0.19/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/api/0.19/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/api/0.19/search/functions_0.js b/api/0.19/search/functions_0.js new file mode 100644 index 000000000..200507791 --- /dev/null +++ b/api/0.19/search/functions_0.js @@ -0,0 +1,62 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_58',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.19/search/groups_0.js b/api/0.19/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.19/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.19/search/groups_1.js b/api/0.19/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.19/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.19/search/groups_2.js b/api/0.19/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.19/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.19/search/mag.svg b/api/0.19/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.19/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.19/search/mag_d.svg b/api/0.19/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.19/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.19/search/mag_sel.svg b/api/0.19/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.19/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.19/search/mag_seld.svg b/api/0.19/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.19/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.19/search/pages_0.js b/api/0.19/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.19/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.19/search/pages_1.js b/api/0.19/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.19/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.19/search/pages_2.js b/api/0.19/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.19/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.19/search/pages_3.js b/api/0.19/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.19/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.19/search/search.css b/api/0.19/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.19/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.19/search/search.js b/api/0.19/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.19/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.19/structxcm__addr__ip.html b/api/0.19/structxcm__addr__ip.html new file mode 100644 index 000000000..291d1dc6d --- /dev/null +++ b/api/0.19/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.19/sync_off.png b/api/0.19/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.19/sync_off.png differ diff --git a/api/0.19/sync_on.png b/api/0.19/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.19/sync_on.png differ diff --git a/api/0.19/tab_a.png b/api/0.19/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.19/tab_a.png differ diff --git a/api/0.19/tab_ad.png b/api/0.19/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.19/tab_ad.png differ diff --git a/api/0.19/tab_b.png b/api/0.19/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.19/tab_b.png differ diff --git a/api/0.19/tab_bd.png b/api/0.19/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.19/tab_bd.png differ diff --git a/api/0.19/tab_h.png b/api/0.19/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.19/tab_h.png differ diff --git a/api/0.19/tab_hd.png b/api/0.19/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.19/tab_hd.png differ diff --git a/api/0.19/tab_s.png b/api/0.19/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.19/tab_s.png differ diff --git a/api/0.19/tab_sd.png b/api/0.19/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.19/tab_sd.png differ diff --git a/api/0.19/tabs.css b/api/0.19/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.19/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.19/topics.html b/api/0.19/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.19/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.19/xcm_8h.html b/api/0.19/xcm_8h.html new file mode 100644 index 000000000..04f90dd48 --- /dev/null +++ b/api/0.19/xcm_8h.html @@ -0,0 +1,915 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.19/xcm_8h_source.html b/api/0.19/xcm_8h_source.html new file mode 100644 index 000000000..8b010e4f3 --- /dev/null +++ b/api/0.19/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1238#include <errno.h>
    +
    1239#include <stdbool.h>
    +
    1240#include <sys/types.h>
    +
    1241
    +
    1242#include <xcm_attr_map.h>
    +
    1243
    +
    1245#define XCM_NONBLOCK (1<<0)
    +
    1246
    +
    1253struct xcm_socket;
    +
    1254
    +
    1307struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1308
    +
    1330struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1331 const struct xcm_attr_map *attrs);
    +
    1332
    +
    1368struct xcm_socket *xcm_server(const char *local_addr);
    +
    1369
    +
    1385struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1386 const struct xcm_attr_map *attrs);
    +
    1387
    +
    1404int xcm_close(struct xcm_socket *socket);
    +
    1405
    +
    1425void xcm_cleanup(struct xcm_socket *socket);
    +
    1426
    +
    1445struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1446
    +
    1466struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1467 const struct xcm_attr_map *attrs);
    +
    1468
    +
    1491int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1492
    +
    1516int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1517
    +
    1520#define XCM_SO_RECEIVABLE (1<<0)
    +
    1523#define XCM_SO_SENDABLE (1<<1)
    +
    1525#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1526
    +
    1587int xcm_await(struct xcm_socket *socket, int condition);
    +
    1588
    +
    1630int xcm_fd(struct xcm_socket *socket);
    +
    1631
    +
    1676int xcm_finish(struct xcm_socket *socket);
    +
    1677
    +
    1718int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1719
    +
    1734bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1735
    +
    1752const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1753
    +
    1768const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1769
    +
    1770#include <xcm_compat.h>
    +
    1771
    +
    1772#ifdef __cplusplus
    +
    1773}
    +
    1774#endif
    +
    1775#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.19/xcm__addr_8h.html b/api/0.19/xcm__addr_8h.html new file mode 100644 index 000000000..9ea9c1b5e --- /dev/null +++ b/api/0.19/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/0.19/xcm__addr_8h_source.html b/api/0.19/xcm__addr_8h_source.html new file mode 100644 index 000000000..3b5f1f8bc --- /dev/null +++ b/api/0.19/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.19/xcm__attr_8h.html b/api/0.19/xcm__attr_8h.html new file mode 100644 index 000000000..e56698d49 --- /dev/null +++ b/api/0.19/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.19/xcm__attr_8h_source.html b/api/0.19/xcm__attr_8h_source.html new file mode 100644 index 000000000..0461a95db --- /dev/null +++ b/api/0.19/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.19/xcm__attr__map_8h.html b/api/0.19/xcm__attr__map_8h.html new file mode 100644 index 000000000..e2491ed67 --- /dev/null +++ b/api/0.19/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.19/xcm__attr__map_8h_source.html b/api/0.19/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..8e1a9d57c --- /dev/null +++ b/api/0.19/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.19/xcm__attr__types_8h.html b/api/0.19/xcm__attr__types_8h.html new file mode 100644 index 000000000..e4d24af0b --- /dev/null +++ b/api/0.19/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.19/xcm__attr__types_8h_source.html b/api/0.19/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..40b93a157 --- /dev/null +++ b/api/0.19/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.19/xcm__compat_8h.html b/api/0.19/xcm__compat_8h.html new file mode 100644 index 000000000..d739b6f39 --- /dev/null +++ b/api/0.19/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.19/xcm__compat_8h_source.html b/api/0.19/xcm__compat_8h_source.html new file mode 100644 index 000000000..aa498fc94 --- /dev/null +++ b/api/0.19/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.19/xcm__version_8h.html b/api/0.19/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.19/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.19/xcm__version_8h_source.html b/api/0.19/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.19/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.20/annotated.html b/api/0.20/annotated.html new file mode 100644 index 000000000..cd09e21d4 --- /dev/null +++ b/api/0.20/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.20/bc_s.png b/api/0.20/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.20/bc_s.png differ diff --git a/api/0.20/bc_sd.png b/api/0.20/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.20/bc_sd.png differ diff --git a/api/0.20/classes.html b/api/0.20/classes.html new file mode 100644 index 000000000..42ab3c002 --- /dev/null +++ b/api/0.20/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.20/closed.png b/api/0.20/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.20/closed.png differ diff --git a/api/0.20/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.20/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..aece9a97b --- /dev/null +++ b/api/0.20/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/api/0.20/doc.svg b/api/0.20/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.20/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.20/docd.svg b/api/0.20/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.20/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.20/doxygen.css b/api/0.20/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.20/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.20/doxygen.svg b/api/0.20/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.20/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.20/dynsections.js b/api/0.20/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.20/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.20/files.html b/api/0.20/files.html new file mode 100644 index 000000000..5dbdfcd95 --- /dev/null +++ b/api/0.20/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/api/0.20/folderclosed.svg b/api/0.20/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.20/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.20/folderclosedd.svg b/api/0.20/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.20/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.20/folderopen.svg b/api/0.20/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.20/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.20/folderopend.svg b/api/0.20/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.20/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.20/functions.html b/api/0.20/functions.html new file mode 100644 index 000000000..d328f41cd --- /dev/null +++ b/api/0.20/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.20/functions_vars.html b/api/0.20/functions_vars.html new file mode 100644 index 000000000..184f25ba9 --- /dev/null +++ b/api/0.20/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.20/globals.html b/api/0.20/globals.html new file mode 100644 index 000000000..60b141017 --- /dev/null +++ b/api/0.20/globals.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.20/globals_defs.html b/api/0.20/globals_defs.html new file mode 100644 index 000000000..15c5bf7bc --- /dev/null +++ b/api/0.20/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.20/globals_enum.html b/api/0.20/globals_enum.html new file mode 100644 index 000000000..a060780df --- /dev/null +++ b/api/0.20/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.20/globals_eval.html b/api/0.20/globals_eval.html new file mode 100644 index 000000000..aa0009505 --- /dev/null +++ b/api/0.20/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.20/globals_func.html b/api/0.20/globals_func.html new file mode 100644 index 000000000..47a4fdce2 --- /dev/null +++ b/api/0.20/globals_func.html @@ -0,0 +1,148 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.20/globals_type.html b/api/0.20/globals_type.html new file mode 100644 index 000000000..9194b97d9 --- /dev/null +++ b/api/0.20/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.20/group__api__version.html b/api/0.20/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.20/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.20/group__lib__version.html b/api/0.20/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.20/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.20/index.html b/api/0.20/index.html new file mode 100644 index 000000000..71f3bf9e3 --- /dev/null +++ b/api/0.20/index.html @@ -0,0 +1,628 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.20 [API]
    +
    +1.5.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    IPv6 link local addresses are not supported.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +
    +
    + + + + diff --git a/api/0.20/inline_umlgraph_pnghtml.pu b/api/0.20/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/api/0.20/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.20/jquery.js b/api/0.20/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.20/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.20/menu.js b/api/0.20/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.20/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.20/menudata.js b/api/0.20/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/api/0.20/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.20/minus.svg b/api/0.20/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.20/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.20/minusd.svg b/api/0.20/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.20/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.20/nav_f.png b/api/0.20/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.20/nav_f.png differ diff --git a/api/0.20/nav_fd.png b/api/0.20/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.20/nav_fd.png differ diff --git a/api/0.20/nav_g.png b/api/0.20/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.20/nav_g.png differ diff --git a/api/0.20/nav_h.png b/api/0.20/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.20/nav_h.png differ diff --git a/api/0.20/nav_hd.png b/api/0.20/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.20/nav_hd.png differ diff --git a/api/0.20/nb_connect_and_send.png b/api/0.20/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.20/nb_connect_and_send.png differ diff --git a/api/0.20/nb_connect_explicit.png b/api/0.20/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/api/0.20/nb_connect_explicit.png differ diff --git a/api/0.20/nb_delayed_connection_refused.png b/api/0.20/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.20/nb_delayed_connection_refused.png differ diff --git a/api/0.20/nb_flush_buffers_before_close.png b/api/0.20/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.20/nb_flush_buffers_before_close.png differ diff --git a/api/0.20/nb_immediate_connection_refused.png b/api/0.20/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.20/nb_immediate_connection_refused.png differ diff --git a/api/0.20/open.png b/api/0.20/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.20/open.png differ diff --git a/api/0.20/plus.svg b/api/0.20/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.20/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.20/plusd.svg b/api/0.20/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.20/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.20/search/all_0.js b/api/0.20/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.20/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.20/search/all_1.js b/api/0.20/search/all_1.js new file mode 100644 index 000000000..a0e0a805e --- /dev/null +++ b/api/0.20/search/all_1.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_5',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_9',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_10',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_12',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_14',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_15',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_16',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_17',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.20/search/all_10.js b/api/0.20/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/api/0.20/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.20/search/all_11.js b/api/0.20/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/api/0.20/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.20/search/all_12.js b/api/0.20/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/api/0.20/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.20/search/all_13.js b/api/0.20/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.20/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.20/search/all_14.js b/api/0.20/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/api/0.20/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.20/search/all_15.js b/api/0.20/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.20/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.20/search/all_16.js b/api/0.20/search/all_16.js new file mode 100644 index 000000000..d9b2d4bae --- /dev/null +++ b/api/0.20/search/all_16.js @@ -0,0 +1,100 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_88',['xcm_version',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_89',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_90',['xcm_version_api',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_91',['xcm_version_api_major',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_92',['xcm_version_api_minor',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_93',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h'],['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h']]], + ['xcm_5fversion_5fminor_94',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h'],['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h']]], + ['xcm_5fversion_5fpatch_95',['xcm_version_patch',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_96',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.20/search/all_2.js b/api/0.20/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/api/0.20/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/0.20/search/all_3.js b/api/0.20/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/api/0.20/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/0.20/search/all_4.js b/api/0.20/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.20/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.20/search/all_5.js b/api/0.20/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.20/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.20/search/all_6.js b/api/0.20/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/api/0.20/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.20/search/all_7.js b/api/0.20/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/0.20/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.20/search/all_8.js b/api/0.20/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.20/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.20/search/all_9.js b/api/0.20/search/all_9.js new file mode 100644 index 000000000..20917f6b6 --- /dev/null +++ b/api/0.20/search/all_9.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.20/search/all_a.js b/api/0.20/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/api/0.20/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.20/search/all_b.js b/api/0.20/search/all_b.js new file mode 100644 index 000000000..d9810deec --- /dev/null +++ b/api/0.20/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/api/0.20/search/all_c.js b/api/0.20/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/0.20/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.20/search/all_d.js b/api/0.20/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/api/0.20/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.20/search/all_e.js b/api/0.20/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/0.20/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.20/search/all_f.js b/api/0.20/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/0.20/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.20/search/classes_0.js b/api/0.20/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.20/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.20/search/close.svg b/api/0.20/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.20/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.20/search/defines_0.js b/api/0.20/search/defines_0.js new file mode 100644 index 000000000..d981023a8 --- /dev/null +++ b/api/0.20/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_14',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_15',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_16',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_17',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_18',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_19',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_20',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/api/0.20/search/enums_0.js b/api/0.20/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.20/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.20/search/enumvalues_0.js b/api/0.20/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.20/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.20/search/files_0.js b/api/0.20/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/api/0.20/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.20/search/functions_0.js b/api/0.20/search/functions_0.js new file mode 100644 index 000000000..1e1147b3e --- /dev/null +++ b/api/0.20/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_58',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_59',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_60',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_61',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_62',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_63',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_64',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_65',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.20/search/groups_0.js b/api/0.20/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.20/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.20/search/groups_1.js b/api/0.20/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.20/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.20/search/groups_2.js b/api/0.20/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.20/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.20/search/mag.svg b/api/0.20/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.20/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.20/search/mag_d.svg b/api/0.20/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.20/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.20/search/mag_sel.svg b/api/0.20/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.20/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.20/search/mag_seld.svg b/api/0.20/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.20/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.20/search/pages_0.js b/api/0.20/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.20/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.20/search/pages_1.js b/api/0.20/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.20/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.20/search/pages_2.js b/api/0.20/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.20/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.20/search/pages_3.js b/api/0.20/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.20/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.20/search/search.css b/api/0.20/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.20/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.20/search/search.js b/api/0.20/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.20/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.20/structxcm__addr__ip.html b/api/0.20/structxcm__addr__ip.html new file mode 100644 index 000000000..506baa94c --- /dev/null +++ b/api/0.20/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.20/sync_off.png b/api/0.20/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.20/sync_off.png differ diff --git a/api/0.20/sync_on.png b/api/0.20/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.20/sync_on.png differ diff --git a/api/0.20/tab_a.png b/api/0.20/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.20/tab_a.png differ diff --git a/api/0.20/tab_ad.png b/api/0.20/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.20/tab_ad.png differ diff --git a/api/0.20/tab_b.png b/api/0.20/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.20/tab_b.png differ diff --git a/api/0.20/tab_bd.png b/api/0.20/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.20/tab_bd.png differ diff --git a/api/0.20/tab_h.png b/api/0.20/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.20/tab_h.png differ diff --git a/api/0.20/tab_hd.png b/api/0.20/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.20/tab_hd.png differ diff --git a/api/0.20/tab_s.png b/api/0.20/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.20/tab_s.png differ diff --git a/api/0.20/tab_sd.png b/api/0.20/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.20/tab_sd.png differ diff --git a/api/0.20/tabs.css b/api/0.20/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.20/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.20/topics.html b/api/0.20/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.20/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.20/xcm_8h.html b/api/0.20/xcm_8h.html new file mode 100644 index 000000000..7752b7692 --- /dev/null +++ b/api/0.20/xcm_8h.html @@ -0,0 +1,915 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.20/xcm_8h_source.html b/api/0.20/xcm_8h_source.html new file mode 100644 index 000000000..ea6e8cd80 --- /dev/null +++ b/api/0.20/xcm_8h_source.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1240#include <errno.h>
    +
    1241#include <stdbool.h>
    +
    1242#include <sys/types.h>
    +
    1243#include <xcm_attr_map.h>
    +
    1244
    +
    1246#define XCM_NONBLOCK (1<<0)
    +
    1247
    +
    1254struct xcm_socket;
    +
    1255
    +
    1308struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1309
    +
    1331struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1332 const struct xcm_attr_map *attrs);
    +
    1333
    +
    1369struct xcm_socket *xcm_server(const char *local_addr);
    +
    1370
    +
    1386struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1387 const struct xcm_attr_map *attrs);
    +
    1388
    +
    1405int xcm_close(struct xcm_socket *socket);
    +
    1406
    +
    1426void xcm_cleanup(struct xcm_socket *socket);
    +
    1427
    +
    1446struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1447
    +
    1467struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1468 const struct xcm_attr_map *attrs);
    +
    1469
    +
    1492int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1493
    +
    1517int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1518
    +
    1521#define XCM_SO_RECEIVABLE (1<<0)
    +
    1524#define XCM_SO_SENDABLE (1<<1)
    +
    1526#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1527
    +
    1588int xcm_await(struct xcm_socket *socket, int condition);
    +
    1589
    +
    1631int xcm_fd(struct xcm_socket *socket);
    +
    1632
    +
    1677int xcm_finish(struct xcm_socket *socket);
    +
    1678
    +
    1719int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1720
    +
    1735bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1736
    +
    1753const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1754
    +
    1769const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1770
    +
    1771#include <xcm_compat.h>
    +
    1772
    +
    1773#ifdef __cplusplus
    +
    1774}
    +
    1775#endif
    +
    1776#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.20/xcm__addr_8h.html b/api/0.20/xcm__addr_8h.html new file mode 100644 index 000000000..bcbbb0b77 --- /dev/null +++ b/api/0.20/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/0.20/xcm__addr_8h_source.html b/api/0.20/xcm__addr_8h_source.html new file mode 100644 index 000000000..7cb562d93 --- /dev/null +++ b/api/0.20/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.20/xcm__attr_8h.html b/api/0.20/xcm__attr_8h.html new file mode 100644 index 000000000..9ed1491ca --- /dev/null +++ b/api/0.20/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.20/xcm__attr_8h_source.html b/api/0.20/xcm__attr_8h_source.html new file mode 100644 index 000000000..57dad51d7 --- /dev/null +++ b/api/0.20/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.20/xcm__attr__map_8h.html b/api/0.20/xcm__attr__map_8h.html new file mode 100644 index 000000000..22a85af33 --- /dev/null +++ b/api/0.20/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.20/xcm__attr__map_8h_source.html b/api/0.20/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..b7c8b7bbb --- /dev/null +++ b/api/0.20/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.20/xcm__attr__types_8h.html b/api/0.20/xcm__attr__types_8h.html new file mode 100644 index 000000000..46b2d1031 --- /dev/null +++ b/api/0.20/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.20/xcm__attr__types_8h_source.html b/api/0.20/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..6c5218729 --- /dev/null +++ b/api/0.20/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.20/xcm__compat_8h.html b/api/0.20/xcm__compat_8h.html new file mode 100644 index 000000000..65e9d981a --- /dev/null +++ b/api/0.20/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.20/xcm__compat_8h_source.html b/api/0.20/xcm__compat_8h_source.html new file mode 100644 index 000000000..45afc05e0 --- /dev/null +++ b/api/0.20/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.20/xcm__version_8h.html b/api/0.20/xcm__version_8h.html new file mode 100644 index 000000000..244196c57 --- /dev/null +++ b/api/0.20/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.20/xcm__version_8h_source.html b/api/0.20/xcm__version_8h_source.html new file mode 100644 index 000000000..6119c8128 --- /dev/null +++ b/api/0.20/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.21/annotated.html b/api/0.21/annotated.html new file mode 100644 index 000000000..ad8c3ebc1 --- /dev/null +++ b/api/0.21/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.21/bc_s.png b/api/0.21/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.21/bc_s.png differ diff --git a/api/0.21/bc_sd.png b/api/0.21/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.21/bc_sd.png differ diff --git a/api/0.21/classes.html b/api/0.21/classes.html new file mode 100644 index 000000000..0a4a1033d --- /dev/null +++ b/api/0.21/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.21/closed.png b/api/0.21/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.21/closed.png differ diff --git a/api/0.21/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.21/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..dad246ccf --- /dev/null +++ b/api/0.21/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/api/0.21/doc.svg b/api/0.21/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.21/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.21/docd.svg b/api/0.21/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.21/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.21/doxygen.css b/api/0.21/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.21/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.21/doxygen.svg b/api/0.21/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.21/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.21/dynsections.js b/api/0.21/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.21/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.21/files.html b/api/0.21/files.html new file mode 100644 index 000000000..e8b5596ba --- /dev/null +++ b/api/0.21/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/api/0.21/folderclosed.svg b/api/0.21/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.21/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.21/folderclosedd.svg b/api/0.21/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.21/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.21/folderopen.svg b/api/0.21/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.21/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.21/folderopend.svg b/api/0.21/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.21/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.21/functions.html b/api/0.21/functions.html new file mode 100644 index 000000000..79c93e849 --- /dev/null +++ b/api/0.21/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.21/functions_vars.html b/api/0.21/functions_vars.html new file mode 100644 index 000000000..bbbbae91e --- /dev/null +++ b/api/0.21/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.21/globals.html b/api/0.21/globals.html new file mode 100644 index 000000000..6e799b2e6 --- /dev/null +++ b/api/0.21/globals.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.21/globals_defs.html b/api/0.21/globals_defs.html new file mode 100644 index 000000000..c2f904bf8 --- /dev/null +++ b/api/0.21/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.21/globals_enum.html b/api/0.21/globals_enum.html new file mode 100644 index 000000000..e8e29624b --- /dev/null +++ b/api/0.21/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.21/globals_eval.html b/api/0.21/globals_eval.html new file mode 100644 index 000000000..d6ff4730c --- /dev/null +++ b/api/0.21/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.21/globals_func.html b/api/0.21/globals_func.html new file mode 100644 index 000000000..34ed8f2cb --- /dev/null +++ b/api/0.21/globals_func.html @@ -0,0 +1,148 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.21/globals_type.html b/api/0.21/globals_type.html new file mode 100644 index 000000000..696dc26ad --- /dev/null +++ b/api/0.21/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.21/group__api__version.html b/api/0.21/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.21/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.21/group__lib__version.html b/api/0.21/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.21/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.21/index.html b/api/0.21/index.html new file mode 100644 index 000000000..87ebaee13 --- /dev/null +++ b/api/0.21/index.html @@ -0,0 +1,636 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.21 [API]
    +
    +1.6.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, the IP

    + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +
    +
    + + + + diff --git a/api/0.21/inline_umlgraph_pnghtml.pu b/api/0.21/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/api/0.21/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.21/jquery.js b/api/0.21/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.21/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.21/menu.js b/api/0.21/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.21/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.21/menudata.js b/api/0.21/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/api/0.21/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.21/minus.svg b/api/0.21/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.21/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.21/minusd.svg b/api/0.21/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.21/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.21/nav_f.png b/api/0.21/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.21/nav_f.png differ diff --git a/api/0.21/nav_fd.png b/api/0.21/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.21/nav_fd.png differ diff --git a/api/0.21/nav_g.png b/api/0.21/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.21/nav_g.png differ diff --git a/api/0.21/nav_h.png b/api/0.21/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.21/nav_h.png differ diff --git a/api/0.21/nav_hd.png b/api/0.21/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.21/nav_hd.png differ diff --git a/api/0.21/nb_connect_and_send.png b/api/0.21/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.21/nb_connect_and_send.png differ diff --git a/api/0.21/nb_connect_explicit.png b/api/0.21/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/api/0.21/nb_connect_explicit.png differ diff --git a/api/0.21/nb_delayed_connection_refused.png b/api/0.21/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.21/nb_delayed_connection_refused.png differ diff --git a/api/0.21/nb_flush_buffers_before_close.png b/api/0.21/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.21/nb_flush_buffers_before_close.png differ diff --git a/api/0.21/nb_immediate_connection_refused.png b/api/0.21/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.21/nb_immediate_connection_refused.png differ diff --git a/api/0.21/open.png b/api/0.21/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.21/open.png differ diff --git a/api/0.21/plus.svg b/api/0.21/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.21/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.21/plusd.svg b/api/0.21/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.21/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.21/search/all_0.js b/api/0.21/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.21/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.21/search/all_1.js b/api/0.21/search/all_1.js new file mode 100644 index 000000000..4e03413ec --- /dev/null +++ b/api/0.21/search/all_1.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_10',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_11',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_12',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_13',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_14',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_15',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_16',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_17',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_18',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.21/search/all_10.js b/api/0.21/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/api/0.21/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.21/search/all_11.js b/api/0.21/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/api/0.21/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.21/search/all_12.js b/api/0.21/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/api/0.21/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.21/search/all_13.js b/api/0.21/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.21/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.21/search/all_14.js b/api/0.21/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/api/0.21/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.21/search/all_15.js b/api/0.21/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.21/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.21/search/all_16.js b/api/0.21/search/all_16.js new file mode 100644 index 000000000..d9b2d4bae --- /dev/null +++ b/api/0.21/search/all_16.js @@ -0,0 +1,100 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_88',['xcm_version',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_89',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_90',['xcm_version_api',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_91',['xcm_version_api_major',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_92',['xcm_version_api_minor',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_93',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h'],['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h']]], + ['xcm_5fversion_5fminor_94',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h'],['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h']]], + ['xcm_5fversion_5fpatch_95',['xcm_version_patch',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_96',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.21/search/all_2.js b/api/0.21/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/api/0.21/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/0.21/search/all_3.js b/api/0.21/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/api/0.21/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/0.21/search/all_4.js b/api/0.21/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/api/0.21/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.21/search/all_5.js b/api/0.21/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.21/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.21/search/all_6.js b/api/0.21/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/api/0.21/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/api/0.21/search/all_7.js b/api/0.21/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/0.21/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.21/search/all_8.js b/api/0.21/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/api/0.21/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.21/search/all_9.js b/api/0.21/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/api/0.21/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.21/search/all_a.js b/api/0.21/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/api/0.21/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.21/search/all_b.js b/api/0.21/search/all_b.js new file mode 100644 index 000000000..1c14c5865 --- /dev/null +++ b/api/0.21/search/all_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_2',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['local_20addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.21/search/all_c.js b/api/0.21/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/0.21/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.21/search/all_d.js b/api/0.21/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/api/0.21/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.21/search/all_e.js b/api/0.21/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/0.21/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.21/search/all_f.js b/api/0.21/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/0.21/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.21/search/classes_0.js b/api/0.21/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.21/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.21/search/close.svg b/api/0.21/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.21/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.21/search/defines_0.js b/api/0.21/search/defines_0.js new file mode 100644 index 000000000..d981023a8 --- /dev/null +++ b/api/0.21/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_14',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_15',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_16',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_17',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_18',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_19',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_20',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/api/0.21/search/enums_0.js b/api/0.21/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.21/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.21/search/enumvalues_0.js b/api/0.21/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.21/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.21/search/files_0.js b/api/0.21/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/api/0.21/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.21/search/functions_0.js b/api/0.21/search/functions_0.js new file mode 100644 index 000000000..1e1147b3e --- /dev/null +++ b/api/0.21/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_58',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_59',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_60',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_61',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_62',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_63',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_64',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_65',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.21/search/groups_0.js b/api/0.21/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.21/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.21/search/groups_1.js b/api/0.21/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.21/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.21/search/groups_2.js b/api/0.21/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.21/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.21/search/mag.svg b/api/0.21/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.21/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.21/search/mag_d.svg b/api/0.21/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.21/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.21/search/mag_sel.svg b/api/0.21/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.21/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.21/search/mag_seld.svg b/api/0.21/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.21/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.21/search/pages_0.js b/api/0.21/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.21/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.21/search/pages_1.js b/api/0.21/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.21/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.21/search/pages_2.js b/api/0.21/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.21/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.21/search/pages_3.js b/api/0.21/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.21/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.21/search/search.css b/api/0.21/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.21/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.21/search/search.js b/api/0.21/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.21/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.21/structxcm__addr__ip.html b/api/0.21/structxcm__addr__ip.html new file mode 100644 index 000000000..78212094b --- /dev/null +++ b/api/0.21/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.21/sync_off.png b/api/0.21/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.21/sync_off.png differ diff --git a/api/0.21/sync_on.png b/api/0.21/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.21/sync_on.png differ diff --git a/api/0.21/tab_a.png b/api/0.21/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.21/tab_a.png differ diff --git a/api/0.21/tab_ad.png b/api/0.21/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.21/tab_ad.png differ diff --git a/api/0.21/tab_b.png b/api/0.21/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.21/tab_b.png differ diff --git a/api/0.21/tab_bd.png b/api/0.21/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.21/tab_bd.png differ diff --git a/api/0.21/tab_h.png b/api/0.21/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.21/tab_h.png differ diff --git a/api/0.21/tab_hd.png b/api/0.21/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.21/tab_hd.png differ diff --git a/api/0.21/tab_s.png b/api/0.21/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.21/tab_s.png differ diff --git a/api/0.21/tab_sd.png b/api/0.21/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.21/tab_sd.png differ diff --git a/api/0.21/tabs.css b/api/0.21/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.21/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.21/topics.html b/api/0.21/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.21/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.21/xcm_8h.html b/api/0.21/xcm_8h.html new file mode 100644 index 000000000..3f150b283 --- /dev/null +++ b/api/0.21/xcm_8h.html @@ -0,0 +1,915 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.21/xcm_8h_source.html b/api/0.21/xcm_8h_source.html new file mode 100644 index 000000000..9acc9251d --- /dev/null +++ b/api/0.21/xcm_8h_source.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1261#include <errno.h>
    +
    1262#include <stdbool.h>
    +
    1263#include <sys/types.h>
    +
    1264#include <xcm_attr_map.h>
    +
    1265
    +
    1267#define XCM_NONBLOCK (1<<0)
    +
    1268
    +
    1275struct xcm_socket;
    +
    1276
    +
    1329struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1330
    +
    1352struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1353 const struct xcm_attr_map *attrs);
    +
    1354
    +
    1390struct xcm_socket *xcm_server(const char *local_addr);
    +
    1391
    +
    1407struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1408 const struct xcm_attr_map *attrs);
    +
    1409
    +
    1426int xcm_close(struct xcm_socket *socket);
    +
    1427
    +
    1447void xcm_cleanup(struct xcm_socket *socket);
    +
    1448
    +
    1467struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1468
    +
    1488struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1489 const struct xcm_attr_map *attrs);
    +
    1490
    +
    1513int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1514
    +
    1538int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1539
    +
    1542#define XCM_SO_RECEIVABLE (1<<0)
    +
    1545#define XCM_SO_SENDABLE (1<<1)
    +
    1547#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1548
    +
    1609int xcm_await(struct xcm_socket *socket, int condition);
    +
    1610
    +
    1652int xcm_fd(struct xcm_socket *socket);
    +
    1653
    +
    1698int xcm_finish(struct xcm_socket *socket);
    +
    1699
    +
    1740int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1741
    +
    1756bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1757
    +
    1774const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1775
    +
    1790const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1791
    +
    1792#include <xcm_compat.h>
    +
    1793
    +
    1794#ifdef __cplusplus
    +
    1795}
    +
    1796#endif
    +
    1797#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.21/xcm__addr_8h.html b/api/0.21/xcm__addr_8h.html new file mode 100644 index 000000000..d60b719d6 --- /dev/null +++ b/api/0.21/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/0.21/xcm__addr_8h_source.html b/api/0.21/xcm__addr_8h_source.html new file mode 100644 index 000000000..5021d368f --- /dev/null +++ b/api/0.21/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.21/xcm__attr_8h.html b/api/0.21/xcm__attr_8h.html new file mode 100644 index 000000000..1cfb47629 --- /dev/null +++ b/api/0.21/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.21/xcm__attr_8h_source.html b/api/0.21/xcm__attr_8h_source.html new file mode 100644 index 000000000..af98b6602 --- /dev/null +++ b/api/0.21/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.21/xcm__attr__map_8h.html b/api/0.21/xcm__attr__map_8h.html new file mode 100644 index 000000000..45e4eece4 --- /dev/null +++ b/api/0.21/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.21/xcm__attr__map_8h_source.html b/api/0.21/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..ea2666f46 --- /dev/null +++ b/api/0.21/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.21/xcm__attr__types_8h.html b/api/0.21/xcm__attr__types_8h.html new file mode 100644 index 000000000..9d74d4b9c --- /dev/null +++ b/api/0.21/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.21/xcm__attr__types_8h_source.html b/api/0.21/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..15150b2d9 --- /dev/null +++ b/api/0.21/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.21/xcm__compat_8h.html b/api/0.21/xcm__compat_8h.html new file mode 100644 index 000000000..449c3345d --- /dev/null +++ b/api/0.21/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.21/xcm__compat_8h_source.html b/api/0.21/xcm__compat_8h_source.html new file mode 100644 index 000000000..49e2840cb --- /dev/null +++ b/api/0.21/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.21/xcm__version_8h.html b/api/0.21/xcm__version_8h.html new file mode 100644 index 000000000..32c1575c2 --- /dev/null +++ b/api/0.21/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   6
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.6.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   21
     
    #define XCM_VERSION_API   "0.21"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   6
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.6.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   21
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.21"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.21/xcm__version_8h_source.html b/api/0.21/xcm__version_8h_source.html new file mode 100644 index 000000000..14ee0e499 --- /dev/null +++ b/api/0.21/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 6
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.6.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 21
    +
    38
    +
    40#define XCM_VERSION_API "0.21"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.22/annotated.html b/api/0.22/annotated.html new file mode 100644 index 000000000..ad35e17c9 --- /dev/null +++ b/api/0.22/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.22/bc_s.png b/api/0.22/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.22/bc_s.png differ diff --git a/api/0.22/bc_sd.png b/api/0.22/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.22/bc_sd.png differ diff --git a/api/0.22/classes.html b/api/0.22/classes.html new file mode 100644 index 000000000..6ca20fc12 --- /dev/null +++ b/api/0.22/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.22/closed.png b/api/0.22/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.22/closed.png differ diff --git a/api/0.22/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.22/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..3c40030e3 --- /dev/null +++ b/api/0.22/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/api/0.22/doc.svg b/api/0.22/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.22/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.22/docd.svg b/api/0.22/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.22/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.22/doxygen.css b/api/0.22/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.22/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.22/doxygen.svg b/api/0.22/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.22/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.22/dynsections.js b/api/0.22/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.22/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.22/files.html b/api/0.22/files.html new file mode 100644 index 000000000..9d3835d00 --- /dev/null +++ b/api/0.22/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/api/0.22/folderclosed.svg b/api/0.22/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.22/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.22/folderclosedd.svg b/api/0.22/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.22/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.22/folderopen.svg b/api/0.22/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.22/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.22/folderopend.svg b/api/0.22/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.22/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.22/functions.html b/api/0.22/functions.html new file mode 100644 index 000000000..e8cb4a8c0 --- /dev/null +++ b/api/0.22/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.22/functions_vars.html b/api/0.22/functions_vars.html new file mode 100644 index 000000000..3ed8d2e2a --- /dev/null +++ b/api/0.22/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.22/globals.html b/api/0.22/globals.html new file mode 100644 index 000000000..0e6a8b34b --- /dev/null +++ b/api/0.22/globals.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.22/globals_defs.html b/api/0.22/globals_defs.html new file mode 100644 index 000000000..4a47feb38 --- /dev/null +++ b/api/0.22/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.22/globals_enum.html b/api/0.22/globals_enum.html new file mode 100644 index 000000000..3dada04c8 --- /dev/null +++ b/api/0.22/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.22/globals_eval.html b/api/0.22/globals_eval.html new file mode 100644 index 000000000..40d7e8679 --- /dev/null +++ b/api/0.22/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.22/globals_func.html b/api/0.22/globals_func.html new file mode 100644 index 000000000..c3aa60010 --- /dev/null +++ b/api/0.22/globals_func.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.22/globals_type.html b/api/0.22/globals_type.html new file mode 100644 index 000000000..6a3a660f8 --- /dev/null +++ b/api/0.22/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.22/group__api__version.html b/api/0.22/group__api__version.html new file mode 100644 index 000000000..3c16b7793 --- /dev/null +++ b/api/0.22/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.22/group__lib__version.html b/api/0.22/group__lib__version.html new file mode 100644 index 000000000..1eaf65a7b --- /dev/null +++ b/api/0.22/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.22/index.html b/api/0.22/index.html new file mode 100644 index 000000000..727e3e06b --- /dev/null +++ b/api/0.22/index.html @@ -0,0 +1,658 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.22 [API]
    +
    +1.7.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, the IP

    + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.cert All Binary RW The leaf certificate to be used. For connection sockets, writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. For connection sockets, writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/api/0.22/inline_umlgraph_pnghtml.pu b/api/0.22/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/api/0.22/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.22/jquery.js b/api/0.22/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.22/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.22/menu.js b/api/0.22/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.22/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.22/menudata.js b/api/0.22/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/api/0.22/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.22/minus.svg b/api/0.22/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.22/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.22/minusd.svg b/api/0.22/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.22/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.22/nav_f.png b/api/0.22/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.22/nav_f.png differ diff --git a/api/0.22/nav_fd.png b/api/0.22/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.22/nav_fd.png differ diff --git a/api/0.22/nav_g.png b/api/0.22/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.22/nav_g.png differ diff --git a/api/0.22/nav_h.png b/api/0.22/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.22/nav_h.png differ diff --git a/api/0.22/nav_hd.png b/api/0.22/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.22/nav_hd.png differ diff --git a/api/0.22/nb_connect_and_send.png b/api/0.22/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.22/nb_connect_and_send.png differ diff --git a/api/0.22/nb_connect_explicit.png b/api/0.22/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/api/0.22/nb_connect_explicit.png differ diff --git a/api/0.22/nb_delayed_connection_refused.png b/api/0.22/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.22/nb_delayed_connection_refused.png differ diff --git a/api/0.22/nb_flush_buffers_before_close.png b/api/0.22/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.22/nb_flush_buffers_before_close.png differ diff --git a/api/0.22/nb_immediate_connection_refused.png b/api/0.22/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.22/nb_immediate_connection_refused.png differ diff --git a/api/0.22/open.png b/api/0.22/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.22/open.png differ diff --git a/api/0.22/plus.svg b/api/0.22/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.22/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.22/plusd.svg b/api/0.22/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.22/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.22/search/all_0.js b/api/0.22/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.22/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.22/search/all_1.js b/api/0.22/search/all_1.js new file mode 100644 index 000000000..e15474fd3 --- /dev/null +++ b/api/0.22/search/all_1.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_14',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_16',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_17',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_18',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_19',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_20',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.22/search/all_10.js b/api/0.22/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/api/0.22/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.22/search/all_11.js b/api/0.22/search/all_11.js new file mode 100644 index 000000000..fa8516b8e --- /dev/null +++ b/api/0.22/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.22/search/all_12.js b/api/0.22/search/all_12.js new file mode 100644 index 000000000..60179a242 --- /dev/null +++ b/api/0.22/search/all_12.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_7',['Tracing',['../index.html#tracing',1,'']]], + ['transport_8',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_9',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_10',['Transports',['../index.html#transports',1,'']]], + ['type_11',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.22/search/all_13.js b/api/0.22/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.22/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.22/search/all_14.js b/api/0.22/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/api/0.22/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.22/search/all_15.js b/api/0.22/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.22/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.22/search/all_16.js b/api/0.22/search/all_16.js new file mode 100644 index 000000000..6807927f8 --- /dev/null +++ b/api/0.22/search/all_16.js @@ -0,0 +1,103 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_26',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_27',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_28',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_29',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_30',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_31',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_32',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_33',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_34',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_35',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_36',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_37',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_39',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_40',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_41',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_42',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_43',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_44',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_45',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_46',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_47',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_48',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_49',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_50',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_51',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_52',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_53',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_54',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_55',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_56',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_57',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_58',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_59',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_60',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_61',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_62',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_63',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_64',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_65',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_66',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_67',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_68',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_69',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_70',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_71',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_72',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_73',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_74',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_75',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_76',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_77',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_78',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_79',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_80',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_81',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_82',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_83',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_84',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_85',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_86',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_87',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_88',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_89',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_90',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_91',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_92',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_93',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_94',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_95',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_96',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_97',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_98',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_99',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.22/search/all_2.js b/api/0.22/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/api/0.22/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/0.22/search/all_3.js b/api/0.22/search/all_3.js new file mode 100644 index 000000000..a111c3bca --- /dev/null +++ b/api/0.22/search/all_3.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['checks_5',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_6',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_8',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_9',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_10',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_11',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_12',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_13',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_14',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_15',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_17',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_18',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_19',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_20',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_21',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/0.22/search/all_4.js b/api/0.22/search/all_4.js new file mode 100644 index 000000000..d7c1ce3c6 --- /dev/null +++ b/api/0.22/search/all_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_6',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.22/search/all_5.js b/api/0.22/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.22/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.22/search/all_6.js b/api/0.22/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/api/0.22/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/api/0.22/search/all_7.js b/api/0.22/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/0.22/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.22/search/all_8.js b/api/0.22/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/api/0.22/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.22/search/all_9.js b/api/0.22/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/api/0.22/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.22/search/all_a.js b/api/0.22/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/api/0.22/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.22/search/all_b.js b/api/0.22/search/all_b.js new file mode 100644 index 000000000..5283f5382 --- /dev/null +++ b/api/0.22/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['local_20addresses_5',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.22/search/all_c.js b/api/0.22/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/0.22/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.22/search/all_d.js b/api/0.22/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/api/0.22/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.22/search/all_e.js b/api/0.22/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/0.22/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.22/search/all_f.js b/api/0.22/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/0.22/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.22/search/classes_0.js b/api/0.22/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.22/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.22/search/close.svg b/api/0.22/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.22/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.22/search/defines_0.js b/api/0.22/search/defines_0.js new file mode 100644 index 000000000..b435664ff --- /dev/null +++ b/api/0.22/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.22/search/enums_0.js b/api/0.22/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.22/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.22/search/enumvalues_0.js b/api/0.22/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/api/0.22/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.22/search/files_0.js b/api/0.22/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/api/0.22/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.22/search/functions_0.js b/api/0.22/search/functions_0.js new file mode 100644 index 000000000..bc7fd35ad --- /dev/null +++ b/api/0.22/search/functions_0.js @@ -0,0 +1,72 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_19',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_20',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_21',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_22',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_23',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_24',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_25',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_26',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_27',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_28',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_29',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_30',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_31',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_32',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_33',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_34',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_35',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_36',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_37',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_38',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_39',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_40',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_41',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_42',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_43',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_44',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_45',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_46',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_47',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_48',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_49',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_50',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_51',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_52',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_53',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_54',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_55',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_56',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_57',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_58',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_59',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_60',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_61',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_62',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_63',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_64',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_65',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_66',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_67',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_68',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.22/search/groups_0.js b/api/0.22/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.22/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.22/search/groups_1.js b/api/0.22/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.22/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.22/search/groups_2.js b/api/0.22/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.22/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.22/search/mag.svg b/api/0.22/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.22/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.22/search/mag_d.svg b/api/0.22/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.22/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.22/search/mag_sel.svg b/api/0.22/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.22/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.22/search/mag_seld.svg b/api/0.22/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.22/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.22/search/pages_0.js b/api/0.22/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.22/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.22/search/pages_1.js b/api/0.22/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.22/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.22/search/pages_2.js b/api/0.22/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.22/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.22/search/pages_3.js b/api/0.22/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.22/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.22/search/search.css b/api/0.22/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.22/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.22/search/search.js b/api/0.22/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.22/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.22/structxcm__addr__ip.html b/api/0.22/structxcm__addr__ip.html new file mode 100644 index 000000000..bfbf528ac --- /dev/null +++ b/api/0.22/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.22/sync_off.png b/api/0.22/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.22/sync_off.png differ diff --git a/api/0.22/sync_on.png b/api/0.22/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.22/sync_on.png differ diff --git a/api/0.22/tab_a.png b/api/0.22/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.22/tab_a.png differ diff --git a/api/0.22/tab_ad.png b/api/0.22/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.22/tab_ad.png differ diff --git a/api/0.22/tab_b.png b/api/0.22/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.22/tab_b.png differ diff --git a/api/0.22/tab_bd.png b/api/0.22/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.22/tab_bd.png differ diff --git a/api/0.22/tab_h.png b/api/0.22/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.22/tab_h.png differ diff --git a/api/0.22/tab_hd.png b/api/0.22/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.22/tab_hd.png differ diff --git a/api/0.22/tab_s.png b/api/0.22/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.22/tab_s.png differ diff --git a/api/0.22/tab_sd.png b/api/0.22/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.22/tab_sd.png differ diff --git a/api/0.22/tabs.css b/api/0.22/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.22/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.22/topics.html b/api/0.22/topics.html new file mode 100644 index 000000000..583e47dca --- /dev/null +++ b/api/0.22/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.22/xcm_8h.html b/api/0.22/xcm_8h.html new file mode 100644 index 000000000..aeb3a0e9f --- /dev/null +++ b/api/0.22/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves a XCM socket's file descriptor, for a XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.22/xcm_8h_source.html b/api/0.22/xcm_8h_source.html new file mode 100644 index 000000000..8c9970cb7 --- /dev/null +++ b/api/0.22/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1304#include <errno.h>
    +
    1305#include <stdbool.h>
    +
    1306#include <stddef.h>
    +
    1307#include <sys/types.h>
    +
    1308#include <xcm_attr_map.h>
    +
    1309
    +
    1311#define XCM_NONBLOCK (1<<0)
    +
    1312
    +
    1319struct xcm_socket;
    +
    1320
    +
    1373struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1374
    +
    1396struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1397 const struct xcm_attr_map *attrs);
    +
    1398
    +
    1434struct xcm_socket *xcm_server(const char *local_addr);
    +
    1435
    +
    1451struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1452 const struct xcm_attr_map *attrs);
    +
    1453
    +
    1470int xcm_close(struct xcm_socket *socket);
    +
    1471
    +
    1491void xcm_cleanup(struct xcm_socket *socket);
    +
    1492
    +
    1511struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1512
    +
    1532struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1533 const struct xcm_attr_map *attrs);
    +
    1534
    +
    1557int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1558
    +
    1582int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1583
    +
    1586#define XCM_SO_RECEIVABLE (1<<0)
    +
    1589#define XCM_SO_SENDABLE (1<<1)
    +
    1591#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1592
    +
    1653int xcm_await(struct xcm_socket *socket, int condition);
    +
    1654
    +
    1702int xcm_fd(struct xcm_socket *socket);
    +
    1703
    +
    1749int xcm_finish(struct xcm_socket *socket);
    +
    1750
    +
    1791int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1792
    +
    1807bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1808
    +
    1825const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1826
    +
    1841const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1842
    +
    1843#include <xcm_compat.h>
    +
    1844
    +
    1845#ifdef __cplusplus
    +
    1846}
    +
    1847#endif
    +
    1848#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.22/xcm__addr_8h.html b/api/0.22/xcm__addr_8h.html new file mode 100644 index 000000000..c12ec9af9 --- /dev/null +++ b/api/0.22/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/0.22/xcm__addr_8h_source.html b/api/0.22/xcm__addr_8h_source.html new file mode 100644 index 000000000..21fa44510 --- /dev/null +++ b/api/0.22/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.22/xcm__attr_8h.html b/api/0.22/xcm__attr_8h.html new file mode 100644 index 000000000..b489ba424 --- /dev/null +++ b/api/0.22/xcm__attr_8h.html @@ -0,0 +1,681 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.22/xcm__attr_8h_source.html b/api/0.22/xcm__attr_8h_source.html new file mode 100644 index 000000000..5e961afea --- /dev/null +++ b/api/0.22/xcm__attr_8h_source.html @@ -0,0 +1,155 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    195int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    196 void *value, size_t capacity);
    +
    197
    +
    199typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    200 void *value, size_t value_len, void *cb_data);
    +
    201
    +
    215void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    216 void *cb_data);
    +
    217
    +
    218#ifdef __cplusplus
    +
    219}
    +
    220#endif
    +
    221#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:199
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.22/xcm__attr__map_8h.html b/api/0.22/xcm__attr__map_8h.html new file mode 100644 index 000000000..bb2324624 --- /dev/null +++ b/api/0.22/xcm__attr__map_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.22/xcm__attr__map_8h_source.html b/api/0.22/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..d876be6e3 --- /dev/null +++ b/api/0.22/xcm__attr__map_8h_source.html @@ -0,0 +1,213 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stddef.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name, bool attr_value);
    +
    81
    +
    82
    +
    92void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    93 const char *attr_name, int64_t attr_value);
    +
    94
    +
    95
    +
    105void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    106 const char *attr_name, const char *attr_value);
    +
    107
    +
    108
    +
    118void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    119 const char *attr_name, const void *attr_value,
    +
    120 size_t attr_value_len);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    133 const struct xcm_attr_map *src_map);
    +
    134
    +
    135
    +
    152const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    153 const char *attr_name,
    +
    154 enum xcm_attr_type *attr_type,
    +
    155 size_t *attr_value_len);
    +
    156
    +
    157
    +
    172const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    173 const char *attr_name);
    +
    174
    +
    175
    +
    190const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    191 const char *attr_name);
    +
    192
    +
    193
    +
    208const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    225const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    226 const char *attr_name);
    +
    227
    +
    236bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    237 const char *attr_name);
    +
    238
    +
    239
    +
    248void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    249
    +
    250
    +
    258size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    259
    +
    260
    +
    264typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    265 enum xcm_attr_type attr_type,
    +
    266 const void *attr_value,
    +
    267 size_t attr_value_len,
    +
    268 void *user);
    +
    269
    +
    270
    +
    283void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    284 xcm_attr_map_foreach_cb cb, void *user);
    +
    285
    +
    286
    +
    295bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    296 const struct xcm_attr_map *attr_map_b);
    +
    297
    +
    306void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    307
    +
    308#ifdef __cplusplus
    +
    309}
    +
    310#endif
    +
    311#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:264
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.22/xcm__attr__types_8h.html b/api/0.22/xcm__attr__types_8h.html new file mode 100644 index 000000000..bd6523129 --- /dev/null +++ b/api/0.22/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.22/xcm__attr__types_8h_source.html b/api/0.22/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..9299fbc1d --- /dev/null +++ b/api/0.22/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.22/xcm__compat_8h.html b/api/0.22/xcm__compat_8h.html new file mode 100644 index 000000000..f56bfb98d --- /dev/null +++ b/api/0.22/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.22/xcm__compat_8h_source.html b/api/0.22/xcm__compat_8h_source.html new file mode 100644 index 000000000..a783cf8b6 --- /dev/null +++ b/api/0.22/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.22/xcm__version_8h.html b/api/0.22/xcm__version_8h.html new file mode 100644 index 000000000..c272f47c0 --- /dev/null +++ b/api/0.22/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.22/xcm__version_8h_source.html b/api/0.22/xcm__version_8h_source.html new file mode 100644 index 000000000..498d1eee1 --- /dev/null +++ b/api/0.22/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 7
    +
    29
    +
    31#define XCM_VERSION_PATCH 0
    +
    32
    +
    34#define XCM_VERSION "1.7.0"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 22
    +
    48
    +
    50#define XCM_VERSION_API "0.22"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.23/annotated.html b/api/0.23/annotated.html new file mode 100644 index 000000000..93f2937c2 --- /dev/null +++ b/api/0.23/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.23/bc_s.png b/api/0.23/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.23/bc_s.png differ diff --git a/api/0.23/bc_sd.png b/api/0.23/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.23/bc_sd.png differ diff --git a/api/0.23/classes.html b/api/0.23/classes.html new file mode 100644 index 000000000..6aabab4ec --- /dev/null +++ b/api/0.23/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.23/closed.png b/api/0.23/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.23/closed.png differ diff --git a/api/0.23/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.23/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..4f77ba857 --- /dev/null +++ b/api/0.23/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/api/0.23/doc.svg b/api/0.23/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.23/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.23/docd.svg b/api/0.23/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.23/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.23/doxygen.css b/api/0.23/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.23/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.23/doxygen.svg b/api/0.23/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.23/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.23/dynsections.js b/api/0.23/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.23/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.23/files.html b/api/0.23/files.html new file mode 100644 index 000000000..5047b184f --- /dev/null +++ b/api/0.23/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/api/0.23/folderclosed.svg b/api/0.23/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.23/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.23/folderclosedd.svg b/api/0.23/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.23/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.23/folderopen.svg b/api/0.23/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.23/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.23/folderopend.svg b/api/0.23/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.23/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.23/functions.html b/api/0.23/functions.html new file mode 100644 index 000000000..daaa3f963 --- /dev/null +++ b/api/0.23/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.23/functions_vars.html b/api/0.23/functions_vars.html new file mode 100644 index 000000000..daae019dc --- /dev/null +++ b/api/0.23/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.23/globals.html b/api/0.23/globals.html new file mode 100644 index 000000000..b622831b5 --- /dev/null +++ b/api/0.23/globals.html @@ -0,0 +1,184 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.23/globals_defs.html b/api/0.23/globals_defs.html new file mode 100644 index 000000000..f13b963fd --- /dev/null +++ b/api/0.23/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.23/globals_enum.html b/api/0.23/globals_enum.html new file mode 100644 index 000000000..0110dce1b --- /dev/null +++ b/api/0.23/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.23/globals_eval.html b/api/0.23/globals_eval.html new file mode 100644 index 000000000..ceebdb161 --- /dev/null +++ b/api/0.23/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.23/globals_func.html b/api/0.23/globals_func.html new file mode 100644 index 000000000..f76f11a78 --- /dev/null +++ b/api/0.23/globals_func.html @@ -0,0 +1,155 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.23/globals_type.html b/api/0.23/globals_type.html new file mode 100644 index 000000000..a390370a3 --- /dev/null +++ b/api/0.23/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.23/group__api__version.html b/api/0.23/group__api__version.html new file mode 100644 index 000000000..77a3f1bab --- /dev/null +++ b/api/0.23/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   23
     
    #define XCM_VERSION_API   "0.23"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   23
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.23"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.23/group__lib__version.html b/api/0.23/group__lib__version.html new file mode 100644 index 000000000..def5fd082 --- /dev/null +++ b/api/0.23/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   8
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.8.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   8
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.8.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.23/index.html b/api/0.23/index.html new file mode 100644 index 000000000..f953af310 --- /dev/null +++ b/api/0.23/index.html @@ -0,0 +1,660 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.23 [API]
    +
    +1.8.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    dns.timeout Connection Double RW The number of seconds until DNS times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query/response transaction to a particular transaction). Only available when the library is built with the c-ares DNS resolver.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.cert All Binary RW The leaf certificate to be used. For connection sockets, writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. For connection sockets, writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes (including the IP and DNS-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/api/0.23/inline_umlgraph_pnghtml.pu b/api/0.23/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/api/0.23/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.23/jquery.js b/api/0.23/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.23/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.23/menu.js b/api/0.23/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.23/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.23/menudata.js b/api/0.23/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/api/0.23/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.23/minus.svg b/api/0.23/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.23/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.23/minusd.svg b/api/0.23/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.23/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.23/nav_f.png b/api/0.23/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.23/nav_f.png differ diff --git a/api/0.23/nav_fd.png b/api/0.23/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.23/nav_fd.png differ diff --git a/api/0.23/nav_g.png b/api/0.23/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.23/nav_g.png differ diff --git a/api/0.23/nav_h.png b/api/0.23/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.23/nav_h.png differ diff --git a/api/0.23/nav_hd.png b/api/0.23/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.23/nav_hd.png differ diff --git a/api/0.23/nb_connect_and_send.png b/api/0.23/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/api/0.23/nb_connect_and_send.png differ diff --git a/api/0.23/nb_connect_explicit.png b/api/0.23/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/api/0.23/nb_connect_explicit.png differ diff --git a/api/0.23/nb_delayed_connection_refused.png b/api/0.23/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/api/0.23/nb_delayed_connection_refused.png differ diff --git a/api/0.23/nb_flush_buffers_before_close.png b/api/0.23/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.23/nb_flush_buffers_before_close.png differ diff --git a/api/0.23/nb_immediate_connection_refused.png b/api/0.23/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.23/nb_immediate_connection_refused.png differ diff --git a/api/0.23/open.png b/api/0.23/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.23/open.png differ diff --git a/api/0.23/plus.svg b/api/0.23/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.23/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.23/plusd.svg b/api/0.23/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.23/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.23/search/all_0.js b/api/0.23/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.23/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.23/search/all_1.js b/api/0.23/search/all_1.js new file mode 100644 index 000000000..e15474fd3 --- /dev/null +++ b/api/0.23/search/all_1.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_14',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_16',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_17',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_18',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_19',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_20',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.23/search/all_10.js b/api/0.23/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/api/0.23/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.23/search/all_11.js b/api/0.23/search/all_11.js new file mode 100644 index 000000000..fa8516b8e --- /dev/null +++ b/api/0.23/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.23/search/all_12.js b/api/0.23/search/all_12.js new file mode 100644 index 000000000..60179a242 --- /dev/null +++ b/api/0.23/search/all_12.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_7',['Tracing',['../index.html#tracing',1,'']]], + ['transport_8',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_9',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_10',['Transports',['../index.html#transports',1,'']]], + ['type_11',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.23/search/all_13.js b/api/0.23/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.23/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.23/search/all_14.js b/api/0.23/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/api/0.23/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.23/search/all_15.js b/api/0.23/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.23/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.23/search/all_16.js b/api/0.23/search/all_16.js new file mode 100644 index 000000000..45795237f --- /dev/null +++ b/api/0.23/search/all_16.js @@ -0,0 +1,108 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_26',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_27',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_28',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_29',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_30',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_31',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_32',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_33',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_34',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_35',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_36',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_37',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_38',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_39',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_40',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_41',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_42',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_43',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_44',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_45',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_46',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_47',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_48',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_50',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_51',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_52',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_53',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_54',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_55',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_56',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_57',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_58',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_59',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_60',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_61',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_62',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_63',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_64',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_65',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_66',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_67',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_68',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_69',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_70',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_71',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_72',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_73',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_74',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_75',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_76',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_77',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_78',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_79',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_80',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_81',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_82',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_83',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_84',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_85',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_86',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_87',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_88',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_89',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_90',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_91',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_92',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_93',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_94',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_95',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_96',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_97',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_98',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_101',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_102',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_103',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_104',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.23/search/all_2.js b/api/0.23/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/api/0.23/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/0.23/search/all_3.js b/api/0.23/search/all_3.js new file mode 100644 index 000000000..a111c3bca --- /dev/null +++ b/api/0.23/search/all_3.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['checks_5',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_6',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_8',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_9',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_10',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_11',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_12',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_13',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_14',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_15',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_17',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_18',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_19',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_20',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_21',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/0.23/search/all_4.js b/api/0.23/search/all_4.js new file mode 100644 index 000000000..d7c1ce3c6 --- /dev/null +++ b/api/0.23/search/all_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_6',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.23/search/all_5.js b/api/0.23/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/api/0.23/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.23/search/all_6.js b/api/0.23/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/api/0.23/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/api/0.23/search/all_7.js b/api/0.23/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/0.23/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.23/search/all_8.js b/api/0.23/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/api/0.23/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.23/search/all_9.js b/api/0.23/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/api/0.23/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.23/search/all_a.js b/api/0.23/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/api/0.23/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.23/search/all_b.js b/api/0.23/search/all_b.js new file mode 100644 index 000000000..5283f5382 --- /dev/null +++ b/api/0.23/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['local_20addresses_5',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.23/search/all_c.js b/api/0.23/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/0.23/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.23/search/all_d.js b/api/0.23/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/api/0.23/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.23/search/all_e.js b/api/0.23/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/0.23/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.23/search/all_f.js b/api/0.23/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/0.23/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.23/search/classes_0.js b/api/0.23/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.23/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.23/search/close.svg b/api/0.23/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.23/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.23/search/defines_0.js b/api/0.23/search/defines_0.js new file mode 100644 index 000000000..b435664ff --- /dev/null +++ b/api/0.23/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.23/search/enums_0.js b/api/0.23/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.23/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.23/search/enumvalues_0.js b/api/0.23/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/api/0.23/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.23/search/files_0.js b/api/0.23/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/api/0.23/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.23/search/functions_0.js b/api/0.23/search/functions_0.js new file mode 100644 index 000000000..dc40e996b --- /dev/null +++ b/api/0.23/search/functions_0.js @@ -0,0 +1,76 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_19',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_20',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_21',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_22',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_23',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_24',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_25',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_26',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_27',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_28',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_29',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_30',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_31',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_32',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_33',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_34',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_35',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_36',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_37',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_38',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_39',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_40',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_41',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_47',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_48',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_49',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_50',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_51',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_52',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_53',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_54',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_55',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_56',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_57',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_58',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_59',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_60',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_61',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_62',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_63',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_64',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_65',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_66',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_67',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_68',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_69',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_70',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_71',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_72',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.23/search/groups_0.js b/api/0.23/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.23/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.23/search/groups_1.js b/api/0.23/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.23/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.23/search/groups_2.js b/api/0.23/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.23/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.23/search/mag.svg b/api/0.23/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.23/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.23/search/mag_d.svg b/api/0.23/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.23/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.23/search/mag_sel.svg b/api/0.23/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.23/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.23/search/mag_seld.svg b/api/0.23/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.23/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.23/search/pages_0.js b/api/0.23/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.23/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.23/search/pages_1.js b/api/0.23/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.23/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.23/search/pages_2.js b/api/0.23/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.23/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.23/search/pages_3.js b/api/0.23/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.23/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.23/search/search.css b/api/0.23/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.23/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.23/search/search.js b/api/0.23/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.23/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.23/structxcm__addr__ip.html b/api/0.23/structxcm__addr__ip.html new file mode 100644 index 000000000..690326be8 --- /dev/null +++ b/api/0.23/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.23/sync_off.png b/api/0.23/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.23/sync_off.png differ diff --git a/api/0.23/sync_on.png b/api/0.23/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.23/sync_on.png differ diff --git a/api/0.23/tab_a.png b/api/0.23/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.23/tab_a.png differ diff --git a/api/0.23/tab_ad.png b/api/0.23/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.23/tab_ad.png differ diff --git a/api/0.23/tab_b.png b/api/0.23/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.23/tab_b.png differ diff --git a/api/0.23/tab_bd.png b/api/0.23/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.23/tab_bd.png differ diff --git a/api/0.23/tab_h.png b/api/0.23/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.23/tab_h.png differ diff --git a/api/0.23/tab_hd.png b/api/0.23/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.23/tab_hd.png differ diff --git a/api/0.23/tab_s.png b/api/0.23/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.23/tab_s.png differ diff --git a/api/0.23/tab_sd.png b/api/0.23/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.23/tab_sd.png differ diff --git a/api/0.23/tabs.css b/api/0.23/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.23/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.23/topics.html b/api/0.23/topics.html new file mode 100644 index 000000000..ecac06e15 --- /dev/null +++ b/api/0.23/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.23/xcm_8h.html b/api/0.23/xcm_8h.html new file mode 100644 index 000000000..ee738603f --- /dev/null +++ b/api/0.23/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves a XCM socket's file descriptor, for a XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.23/xcm_8h_source.html b/api/0.23/xcm_8h_source.html new file mode 100644 index 000000000..be08b86d1 --- /dev/null +++ b/api/0.23/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1306#include <errno.h>
    +
    1307#include <stdbool.h>
    +
    1308#include <stddef.h>
    +
    1309#include <sys/types.h>
    +
    1310#include <xcm_attr_map.h>
    +
    1311
    +
    1313#define XCM_NONBLOCK (1<<0)
    +
    1314
    +
    1321struct xcm_socket;
    +
    1322
    +
    1375struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1376
    +
    1398struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1399 const struct xcm_attr_map *attrs);
    +
    1400
    +
    1436struct xcm_socket *xcm_server(const char *local_addr);
    +
    1437
    +
    1453struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1454 const struct xcm_attr_map *attrs);
    +
    1455
    +
    1472int xcm_close(struct xcm_socket *socket);
    +
    1473
    +
    1493void xcm_cleanup(struct xcm_socket *socket);
    +
    1494
    +
    1513struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1514
    +
    1534struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1535 const struct xcm_attr_map *attrs);
    +
    1536
    +
    1559int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1560
    +
    1584int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1585
    +
    1588#define XCM_SO_RECEIVABLE (1<<0)
    +
    1591#define XCM_SO_SENDABLE (1<<1)
    +
    1593#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1594
    +
    1655int xcm_await(struct xcm_socket *socket, int condition);
    +
    1656
    +
    1704int xcm_fd(struct xcm_socket *socket);
    +
    1705
    +
    1751int xcm_finish(struct xcm_socket *socket);
    +
    1752
    +
    1793int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1794
    +
    1809bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1810
    +
    1827const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1828
    +
    1843const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1844
    +
    1845#include <xcm_compat.h>
    +
    1846
    +
    1847#ifdef __cplusplus
    +
    1848}
    +
    1849#endif
    +
    1850#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.23/xcm__addr_8h.html b/api/0.23/xcm__addr_8h.html new file mode 100644 index 000000000..2b36a4c55 --- /dev/null +++ b/api/0.23/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/0.23/xcm__addr_8h_source.html b/api/0.23/xcm__addr_8h_source.html new file mode 100644 index 000000000..e6b5d9ad1 --- /dev/null +++ b/api/0.23/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.23/xcm__attr_8h.html b/api/0.23/xcm__attr_8h.html new file mode 100644 index 000000000..dcc5fb9e1 --- /dev/null +++ b/api/0.23/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.23/xcm__attr_8h_source.html b/api/0.23/xcm__attr_8h_source.html new file mode 100644 index 000000000..b222b6d6b --- /dev/null +++ b/api/0.23/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.23/xcm__attr__map_8h.html b/api/0.23/xcm__attr__map_8h.html new file mode 100644 index 000000000..b737d779a --- /dev/null +++ b/api/0.23/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.23/xcm__attr__map_8h_source.html b/api/0.23/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..2c2e250a0 --- /dev/null +++ b/api/0.23/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.23/xcm__attr__types_8h.html b/api/0.23/xcm__attr__types_8h.html new file mode 100644 index 000000000..e9957c781 --- /dev/null +++ b/api/0.23/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.23/xcm__attr__types_8h_source.html b/api/0.23/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..e0feaeab5 --- /dev/null +++ b/api/0.23/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.23/xcm__compat_8h.html b/api/0.23/xcm__compat_8h.html new file mode 100644 index 000000000..31591869e --- /dev/null +++ b/api/0.23/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.23/xcm__compat_8h_source.html b/api/0.23/xcm__compat_8h_source.html new file mode 100644 index 000000000..f4ab0c270 --- /dev/null +++ b/api/0.23/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.23/xcm__version_8h.html b/api/0.23/xcm__version_8h.html new file mode 100644 index 000000000..77124e6d6 --- /dev/null +++ b/api/0.23/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   8
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.8.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   23
     
    #define XCM_VERSION_API   "0.23"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.23/xcm__version_8h_source.html b/api/0.23/xcm__version_8h_source.html new file mode 100644 index 000000000..5c00f1067 --- /dev/null +++ b/api/0.23/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 8
    +
    29
    +
    31#define XCM_VERSION_PATCH 0
    +
    32
    +
    34#define XCM_VERSION "1.8.0"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 23
    +
    48
    +
    50#define XCM_VERSION_API "0.23"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.24/annotated.html b/api/0.24/annotated.html new file mode 100644 index 000000000..735a869d4 --- /dev/null +++ b/api/0.24/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.24/bc_s.png b/api/0.24/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.24/bc_s.png differ diff --git a/api/0.24/bc_sd.png b/api/0.24/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.24/bc_sd.png differ diff --git a/api/0.24/classes.html b/api/0.24/classes.html new file mode 100644 index 000000000..dfea661cb --- /dev/null +++ b/api/0.24/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.24/closed.png b/api/0.24/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.24/closed.png differ diff --git a/api/0.24/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.24/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..a99290ff1 --- /dev/null +++ b/api/0.24/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/api/0.24/doc.svg b/api/0.24/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.24/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.24/docd.svg b/api/0.24/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.24/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.24/doxygen.css b/api/0.24/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.24/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.24/doxygen.svg b/api/0.24/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.24/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.24/dynsections.js b/api/0.24/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.24/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.24/files.html b/api/0.24/files.html new file mode 100644 index 000000000..c319cf183 --- /dev/null +++ b/api/0.24/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/api/0.24/folderclosed.svg b/api/0.24/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.24/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.24/folderclosedd.svg b/api/0.24/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.24/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.24/folderopen.svg b/api/0.24/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.24/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.24/folderopend.svg b/api/0.24/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.24/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.24/functions.html b/api/0.24/functions.html new file mode 100644 index 000000000..3bac3aca1 --- /dev/null +++ b/api/0.24/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.24/functions_vars.html b/api/0.24/functions_vars.html new file mode 100644 index 000000000..b9da69d8a --- /dev/null +++ b/api/0.24/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.24/globals.html b/api/0.24/globals.html new file mode 100644 index 000000000..c8eb0902c --- /dev/null +++ b/api/0.24/globals.html @@ -0,0 +1,187 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.24/globals_defs.html b/api/0.24/globals_defs.html new file mode 100644 index 000000000..02a317659 --- /dev/null +++ b/api/0.24/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.24/globals_enum.html b/api/0.24/globals_enum.html new file mode 100644 index 000000000..4bb1f7c0e --- /dev/null +++ b/api/0.24/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.24/globals_eval.html b/api/0.24/globals_eval.html new file mode 100644 index 000000000..babafdd9d --- /dev/null +++ b/api/0.24/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.24/globals_func.html b/api/0.24/globals_func.html new file mode 100644 index 000000000..8fbaf496b --- /dev/null +++ b/api/0.24/globals_func.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.24/globals_type.html b/api/0.24/globals_type.html new file mode 100644 index 000000000..1bb37f017 --- /dev/null +++ b/api/0.24/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.24/group__api__version.html b/api/0.24/group__api__version.html new file mode 100644 index 000000000..6de14ef56 --- /dev/null +++ b/api/0.24/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   24
     
    #define XCM_VERSION_API   "0.24"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   24
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.24"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.24/group__lib__version.html b/api/0.24/group__lib__version.html new file mode 100644 index 000000000..697b63b02 --- /dev/null +++ b/api/0.24/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   9
     
    #define XCM_VERSION_PATCH   2
     
    #define XCM_VERSION   "1.9.2"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   9
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   2
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.9.2"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.24/index.html b/api/0.24/index.html new file mode 100644 index 000000000..a00d20f3c --- /dev/null +++ b/api/0.24/index.html @@ -0,0 +1,718 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.24 [API]
    +
    +1.9.2 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is a shared library implementing an inter-process communication service on Linux. It facilitates communication between processes on the same system, as well as over a network.

    +

    XCM internals are divided into the core library, and a number of pluggable transports, handling the actual data delivery. In combination with an URL-like addressing scheme, it allows applications to be transport agnostic, and an IPC mechanism suitable for one deployment can seamlessly be replaced with another, in another deployment. The API semantics are the same, regardless of underlying transport used.

    +

    An XCM transport either provides a messaging or a byte stream type service.

    +

    XCM supports UNIX domain sockets for efficient local-only communication, and TCP, TLS and SCTP for remote inter-process communication. The service XCM provides is of the connection-oriented, client-server type. It is not a message bus and does not implement the publish-subscribe or broadcast patterns.

    +

    This document primarily serves as an API specification, but also also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Sockets API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    An XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport and BTCP Transport transports provide a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing an XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP, BTCP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP, BTLS and BTCP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) allocates a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of an XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object remains the same across the life-time of the socket.

    +

    In the BSD Sockets API, the socket fd being readable means it's likely, but not guaranteed, that the application can successfully read data from the socket. Similarly, a fd marked writable by for example poll() signifies that the application is likely to be able to write data to the socket.

    +

    An application using non-blocking XCM sockets must always wait for the XCM socket fd to become readable (e.g., the XCM socket fd should always be in the readfds in the select() call), regardless of the target condition. Thus, even if the application is waiting for an opportunity to send a message on a XCM socket, or is not interested in performing any type of operation on the socket, it must wait for the XCM socket fd to become readable. Not being interested in performing any operation here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket.

    +

    An application must always include all of its XCM socket fds into readfds in the select() call. An application must not leave an XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or neither of xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are called when its fd is marked readable by select().

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    The inability to finish the requested operation without blocking the thread (i.e., putting the thread to sleep) is signaled in the typical UNIX manner, by returning an NULL or -1, (depending on the return type) and setting errno to EAGAIN. Unlike most other errno values, EAGAIN is a temporary conditional, and not a terminal error.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the an XCM server socket is in non-blocking mode at the time of an xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on an XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    An XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, TCP, and BTCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided they operate on different sockets. Calls pertaining to the same sockets are not MT safe.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" an XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing an XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of an xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), an xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of an XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    Due to a bug in OpenSSL, partial chains (i.e., where the trust anchor is a trusted non-root certificate) is not allowed when CRL checking is enabled. In OpenSSL terms, X509_V_FLAG_PARTIAL_CHAIN is disabled when X509_V_FLAG_CRL_CHECK_ALL is enabled. Future versions of XCM, built against newer versions of OpenSSL, may allow partial chains in combination with CRL checking.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/api/0.24/inline_umlgraph_pnghtml.pu b/api/0.24/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..3d9fdf388 --- /dev/null +++ b/api/0.24/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(101, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(5, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(6, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.24/jquery.js b/api/0.24/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.24/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.24/menu.js b/api/0.24/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.24/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.24/menudata.js b/api/0.24/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/api/0.24/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.24/minus.svg b/api/0.24/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.24/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.24/minusd.svg b/api/0.24/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.24/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.24/nav_f.png b/api/0.24/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.24/nav_f.png differ diff --git a/api/0.24/nav_fd.png b/api/0.24/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.24/nav_fd.png differ diff --git a/api/0.24/nav_g.png b/api/0.24/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.24/nav_g.png differ diff --git a/api/0.24/nav_h.png b/api/0.24/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.24/nav_h.png differ diff --git a/api/0.24/nav_hd.png b/api/0.24/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.24/nav_hd.png differ diff --git a/api/0.24/nb_connect_and_send.png b/api/0.24/nb_connect_and_send.png new file mode 100644 index 000000000..ec94eb015 Binary files /dev/null and b/api/0.24/nb_connect_and_send.png differ diff --git a/api/0.24/nb_connect_explicit.png b/api/0.24/nb_connect_explicit.png new file mode 100644 index 000000000..a5df8f3b6 Binary files /dev/null and b/api/0.24/nb_connect_explicit.png differ diff --git a/api/0.24/nb_delayed_connection_refused.png b/api/0.24/nb_delayed_connection_refused.png new file mode 100644 index 000000000..5c216bb18 Binary files /dev/null and b/api/0.24/nb_delayed_connection_refused.png differ diff --git a/api/0.24/nb_flush_buffers_before_close.png b/api/0.24/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.24/nb_flush_buffers_before_close.png differ diff --git a/api/0.24/nb_immediate_connection_refused.png b/api/0.24/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.24/nb_immediate_connection_refused.png differ diff --git a/api/0.24/open.png b/api/0.24/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.24/open.png differ diff --git a/api/0.24/plus.svg b/api/0.24/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.24/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.24/plusd.svg b/api/0.24/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.24/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.24/search/all_0.js b/api/0.24/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.24/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.24/search/all_1.js b/api/0.24/search/all_1.js new file mode 100644 index 000000000..70206c175 --- /dev/null +++ b/api/0.24/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_14',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_15',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_17',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_18',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_19',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_20',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_21',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.24/search/all_10.js b/api/0.24/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/api/0.24/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.24/search/all_11.js b/api/0.24/search/all_11.js new file mode 100644 index 000000000..482e3e761 --- /dev/null +++ b/api/0.24/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.24/search/all_12.js b/api/0.24/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/api/0.24/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.24/search/all_13.js b/api/0.24/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.24/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.24/search/all_14.js b/api/0.24/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/api/0.24/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.24/search/all_15.js b/api/0.24/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.24/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.24/search/all_16.js b/api/0.24/search/all_16.js new file mode 100644 index 000000000..3c9d9cbf8 --- /dev/null +++ b/api/0.24/search/all_16.js @@ -0,0 +1,111 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_7',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_8',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_9',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_10',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_11',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_12',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_13',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_14',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_15',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_16',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_17',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_18',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_19',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_20',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_21',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_22',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_23',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_24',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_25',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_26',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_27',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_28',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_29',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_30',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_31',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_32',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_33',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_34',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_35',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_36',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_38',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_39',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_40',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_41',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_42',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_43',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_44',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_45',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_46',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_47',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_48',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_49',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_50',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_51',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_52',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_53',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_54',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_55',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_56',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_57',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_58',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_59',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_60',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_61',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_62',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_63',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_64',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_65',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_66',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_67',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_68',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_69',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_70',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_71',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_72',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_73',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_74',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_75',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_76',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_77',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_78',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_79',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_80',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_81',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_82',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_83',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_84',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_85',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_86',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_87',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_88',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_89',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_90',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_91',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_92',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_93',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_94',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_95',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_96',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_97',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_98',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_102',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_103',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_104',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_107',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.24/search/all_2.js b/api/0.24/search/all_2.js new file mode 100644 index 000000000..6f594310c --- /dev/null +++ b/api/0.24/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_5',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_6',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_8',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_9',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/0.24/search/all_3.js b/api/0.24/search/all_3.js new file mode 100644 index 000000000..61125c0c2 --- /dev/null +++ b/api/0.24/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/0.24/search/all_4.js b/api/0.24/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/api/0.24/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.24/search/all_5.js b/api/0.24/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/api/0.24/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.24/search/all_6.js b/api/0.24/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/api/0.24/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/api/0.24/search/all_7.js b/api/0.24/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/0.24/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.24/search/all_8.js b/api/0.24/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/api/0.24/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.24/search/all_9.js b/api/0.24/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/api/0.24/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.24/search/all_a.js b/api/0.24/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/api/0.24/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.24/search/all_b.js b/api/0.24/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/api/0.24/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.24/search/all_c.js b/api/0.24/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/0.24/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.24/search/all_d.js b/api/0.24/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/api/0.24/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.24/search/all_e.js b/api/0.24/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/0.24/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.24/search/all_f.js b/api/0.24/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/0.24/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.24/search/classes_0.js b/api/0.24/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.24/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.24/search/close.svg b/api/0.24/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.24/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.24/search/defines_0.js b/api/0.24/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/api/0.24/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.24/search/enums_0.js b/api/0.24/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.24/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.24/search/enumvalues_0.js b/api/0.24/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/api/0.24/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.24/search/files_0.js b/api/0.24/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/api/0.24/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.24/search/functions_0.js b/api/0.24/search/functions_0.js new file mode 100644 index 000000000..f4492c0a5 --- /dev/null +++ b/api/0.24/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_2',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_3',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_4',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_5',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_6',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_7',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_8',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_9',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_10',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_11',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_19',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_20',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_21',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_22',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_23',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_24',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_25',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_26',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_27',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_28',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_30',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_31',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_32',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_33',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_34',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_35',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_36',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_37',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_38',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_39',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_41',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_42',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_43',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_44',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_45',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_46',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_47',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_48',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_49',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_52',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_53',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_54',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_55',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_56',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_57',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_58',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_59',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_60',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_61',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_62',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_63',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_64',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_65',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_66',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_67',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_68',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_69',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_70',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_71',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_72',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_73',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_74',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.24/search/groups_0.js b/api/0.24/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.24/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.24/search/groups_1.js b/api/0.24/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.24/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.24/search/groups_2.js b/api/0.24/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.24/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.24/search/mag.svg b/api/0.24/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.24/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.24/search/mag_d.svg b/api/0.24/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.24/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.24/search/mag_sel.svg b/api/0.24/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.24/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.24/search/mag_seld.svg b/api/0.24/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.24/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.24/search/pages_0.js b/api/0.24/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.24/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.24/search/pages_1.js b/api/0.24/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.24/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.24/search/pages_2.js b/api/0.24/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.24/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.24/search/pages_3.js b/api/0.24/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.24/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.24/search/search.css b/api/0.24/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.24/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.24/search/search.js b/api/0.24/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.24/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.24/structxcm__addr__ip.html b/api/0.24/structxcm__addr__ip.html new file mode 100644 index 000000000..160a10267 --- /dev/null +++ b/api/0.24/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.24/sync_off.png b/api/0.24/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.24/sync_off.png differ diff --git a/api/0.24/sync_on.png b/api/0.24/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.24/sync_on.png differ diff --git a/api/0.24/tab_a.png b/api/0.24/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.24/tab_a.png differ diff --git a/api/0.24/tab_ad.png b/api/0.24/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.24/tab_ad.png differ diff --git a/api/0.24/tab_b.png b/api/0.24/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.24/tab_b.png differ diff --git a/api/0.24/tab_bd.png b/api/0.24/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.24/tab_bd.png differ diff --git a/api/0.24/tab_h.png b/api/0.24/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.24/tab_h.png differ diff --git a/api/0.24/tab_hd.png b/api/0.24/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.24/tab_hd.png differ diff --git a/api/0.24/tab_s.png b/api/0.24/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.24/tab_s.png differ diff --git a/api/0.24/tab_sd.png b/api/0.24/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.24/tab_sd.png differ diff --git a/api/0.24/tabs.css b/api/0.24/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.24/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.24/topics.html b/api/0.24/topics.html new file mode 100644 index 000000000..b842c726c --- /dev/null +++ b/api/0.24/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.24/xcm_8h.html b/api/0.24/xcm_8h.html new file mode 100644 index 000000000..84ba2dadd --- /dev/null +++ b/api/0.24/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), an xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close an XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to an XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves an XCM socket's file descriptor, for an XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.24/xcm_8h_source.html b/api/0.24/xcm_8h_source.html new file mode 100644 index 000000000..e861283e1 --- /dev/null +++ b/api/0.24/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1450#include <errno.h>
    +
    1451#include <stdbool.h>
    +
    1452#include <stddef.h>
    +
    1453#include <sys/types.h>
    +
    1454#include <xcm_attr_map.h>
    +
    1455
    +
    1457#define XCM_NONBLOCK (1<<0)
    +
    1458
    +
    1465struct xcm_socket;
    +
    1466
    +
    1519struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520
    +
    1542struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543 const struct xcm_attr_map *attrs);
    +
    1544
    +
    1580struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581
    +
    1597struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598 const struct xcm_attr_map *attrs);
    +
    1599
    +
    1616int xcm_close(struct xcm_socket *socket);
    +
    1617
    +
    1637void xcm_cleanup(struct xcm_socket *socket);
    +
    1638
    +
    1657struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1658
    +
    1678struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1679 const struct xcm_attr_map *attrs);
    +
    1680
    +
    1703int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1704 const void *__restrict buf, size_t len);
    +
    1705
    +
    1729int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1730 void *__restrict buf, size_t capacity);
    +
    1731
    +
    1734#define XCM_SO_RECEIVABLE (1<<0)
    +
    1737#define XCM_SO_SENDABLE (1<<1)
    +
    1739#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1740
    +
    1801int xcm_await(struct xcm_socket *socket, int condition);
    +
    1802
    +
    1850int xcm_fd(struct xcm_socket *socket);
    +
    1851
    +
    1897int xcm_finish(struct xcm_socket *socket);
    +
    1898
    +
    1939int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1940
    +
    1955bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1956
    +
    1973const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1974
    +
    1989const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1990
    +
    1991#include <xcm_compat.h>
    +
    1992
    +
    1993#ifdef __cplusplus
    +
    1994}
    +
    1995#endif
    +
    1996#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.24/xcm__addr_8h.html b/api/0.24/xcm__addr_8h.html new file mode 100644 index 000000000..b44066bc9 --- /dev/null +++ b/api/0.24/xcm__addr_8h.html @@ -0,0 +1,1207 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of an XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/0.24/xcm__addr_8h_source.html b/api/0.24/xcm__addr_8h_source.html new file mode 100644 index 000000000..018432e9d --- /dev/null +++ b/api/0.24/xcm__addr_8h_source.html @@ -0,0 +1,224 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    44#define XCM_BTCP_PROTO "btcp"
    +
    45
    +
    46enum xcm_addr_type {
    +
    47 xcm_addr_type_name,
    +
    48 xcm_addr_type_ip
    +
    49};
    +
    50
    +
    + +
    53{
    +
    55 sa_family_t family;
    +
    56
    +
    58 union {
    +
    61 in_addr_t ip4;
    +
    64 uint8_t ip6[16];
    + +
    66};
    +
    +
    67
    +
    + +
    70{
    +
    72 enum xcm_addr_type type;
    +
    73
    +
    75 union {
    +
    76 struct xcm_addr_ip ip;
    +
    77 /* Max DNS name length is 253 characters */
    +
    78 char name[254];
    +
    79 };
    +
    80};
    +
    +
    81
    +
    95int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96
    +
    110int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111 uint16_t *port);
    +
    112
    +
    126int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127 uint16_t *port);
    +
    128
    +
    143int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144 uint16_t *port);
    +
    145
    +
    160int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161 uint16_t *port);
    +
    162
    +
    176int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177
    +
    191int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192 size_t capacity);
    +
    193
    +
    207int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208 uint16_t *port);
    +
    209
    +
    223int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224 uint16_t *port);
    +
    225
    +
    241int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *utls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tls_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *tcp_addr_s, size_t capacity);
    +
    279
    +
    295int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296 char *sctp_addr_s, size_t capacity);
    +
    297
    +
    312int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313
    +
    328int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329
    +
    345int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346 char *btcp_addr_s, size_t capacity);
    +
    347
    +
    363int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    364 char *btls_addr_s, size_t capacity);
    +
    365
    +
    366#include <xcm_addr_compat.h>
    +
    367
    +
    368#ifdef __cplusplus
    +
    369}
    +
    370#endif
    +
    371#endif
    +
    Definition xcm_addr.h:70
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:72
    +
    Definition xcm_addr.h:53
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:55
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:64
    +
    in_addr_t ip4
    Definition xcm_addr.h:61
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.24/xcm__attr_8h.html b/api/0.24/xcm__attr_8h.html new file mode 100644 index 000000000..4f292985a --- /dev/null +++ b/api/0.24/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.24/xcm__attr_8h_source.html b/api/0.24/xcm__attr_8h_source.html new file mode 100644 index 000000000..5c9002d57 --- /dev/null +++ b/api/0.24/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.24/xcm__attr__map_8h.html b/api/0.24/xcm__attr__map_8h.html new file mode 100644 index 000000000..e493e2c4b --- /dev/null +++ b/api/0.24/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.24/xcm__attr__map_8h_source.html b/api/0.24/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..6552aed54 --- /dev/null +++ b/api/0.24/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.24/xcm__attr__types_8h.html b/api/0.24/xcm__attr__types_8h.html new file mode 100644 index 000000000..fffbc7794 --- /dev/null +++ b/api/0.24/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.24/xcm__attr__types_8h_source.html b/api/0.24/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..1e1be5f63 --- /dev/null +++ b/api/0.24/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.24/xcm__compat_8h.html b/api/0.24/xcm__compat_8h.html new file mode 100644 index 000000000..c7cc4e7f3 --- /dev/null +++ b/api/0.24/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.24/xcm__compat_8h_source.html b/api/0.24/xcm__compat_8h_source.html new file mode 100644 index 000000000..e0051a00f --- /dev/null +++ b/api/0.24/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.24/xcm__version_8h.html b/api/0.24/xcm__version_8h.html new file mode 100644 index 000000000..9a8998ff9 --- /dev/null +++ b/api/0.24/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   9
     
    #define XCM_VERSION_PATCH   2
     
    #define XCM_VERSION   "1.9.2"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   24
     
    #define XCM_VERSION_API   "0.24"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.24/xcm__version_8h_source.html b/api/0.24/xcm__version_8h_source.html new file mode 100644 index 000000000..9f197ea7f --- /dev/null +++ b/api/0.24/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 9
    +
    29
    +
    31#define XCM_VERSION_PATCH 2
    +
    32
    +
    34#define XCM_VERSION "1.9.2"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 24
    +
    48
    +
    50#define XCM_VERSION_API "0.24"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/0.25/annotated.html b/api/0.25/annotated.html new file mode 100644 index 000000000..9204276c4 --- /dev/null +++ b/api/0.25/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/0.25/bc_s.png b/api/0.25/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/0.25/bc_s.png differ diff --git a/api/0.25/bc_sd.png b/api/0.25/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/0.25/bc_sd.png differ diff --git a/api/0.25/classes.html b/api/0.25/classes.html new file mode 100644 index 000000000..7f1e57fc4 --- /dev/null +++ b/api/0.25/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/0.25/closed.png b/api/0.25/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/0.25/closed.png differ diff --git a/api/0.25/dir_d44c64559bbebec7f509842c48db8b23.html b/api/0.25/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..0aadf2465 --- /dev/null +++ b/api/0.25/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/api/0.25/doc.svg b/api/0.25/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/0.25/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.25/docd.svg b/api/0.25/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/0.25/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.25/doxygen.css b/api/0.25/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/0.25/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/0.25/doxygen.svg b/api/0.25/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/0.25/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/0.25/dynsections.js b/api/0.25/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/0.25/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/0.25/files.html b/api/0.25/files.html new file mode 100644 index 000000000..961c13d7a --- /dev/null +++ b/api/0.25/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/api/0.25/folderclosed.svg b/api/0.25/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/0.25/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.25/folderclosedd.svg b/api/0.25/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/0.25/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/0.25/folderopen.svg b/api/0.25/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/0.25/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/0.25/folderopend.svg b/api/0.25/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/0.25/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/0.25/functions.html b/api/0.25/functions.html new file mode 100644 index 000000000..15d448c82 --- /dev/null +++ b/api/0.25/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.25/functions_vars.html b/api/0.25/functions_vars.html new file mode 100644 index 000000000..c988c704f --- /dev/null +++ b/api/0.25/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/0.25/globals.html b/api/0.25/globals.html new file mode 100644 index 000000000..cab2bcbcd --- /dev/null +++ b/api/0.25/globals.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.25/globals_defs.html b/api/0.25/globals_defs.html new file mode 100644 index 000000000..b6063656a --- /dev/null +++ b/api/0.25/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/0.25/globals_enum.html b/api/0.25/globals_enum.html new file mode 100644 index 000000000..a87a576be --- /dev/null +++ b/api/0.25/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/0.25/globals_eval.html b/api/0.25/globals_eval.html new file mode 100644 index 000000000..0d304d445 --- /dev/null +++ b/api/0.25/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/0.25/globals_func.html b/api/0.25/globals_func.html new file mode 100644 index 000000000..d4c0c9686 --- /dev/null +++ b/api/0.25/globals_func.html @@ -0,0 +1,159 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/0.25/globals_type.html b/api/0.25/globals_type.html new file mode 100644 index 000000000..3fb6e686d --- /dev/null +++ b/api/0.25/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/0.25/group__api__version.html b/api/0.25/group__api__version.html new file mode 100644 index 000000000..fad94c2c5 --- /dev/null +++ b/api/0.25/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   25
     
    #define XCM_VERSION_API   "0.25"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   25
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.25"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.25/group__lib__version.html b/api/0.25/group__lib__version.html new file mode 100644 index 000000000..d52d981da --- /dev/null +++ b/api/0.25/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   10
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.10.1"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   10
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   1
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.10.1"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/0.25/index.html b/api/0.25/index.html new file mode 100644 index 000000000..1531c8566 --- /dev/null +++ b/api/0.25/index.html @@ -0,0 +1,718 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.25 [API]
    +
    +1.10.1 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is a shared library implementing an inter-process communication service on Linux. It facilitates communication between processes on the same system, as well as over a network.

    +

    XCM internals are divided into the core library, and a number of pluggable transports, handling the actual data delivery. In combination with an URL-like addressing scheme, it allows applications to be transport agnostic, and an IPC mechanism suitable for one deployment can seamlessly be replaced with another, in another deployment. The API semantics are the same, regardless of underlying transport used.

    +

    An XCM transport either provides a messaging or a byte stream type service.

    +

    XCM supports UNIX domain sockets for efficient local-only communication, and TCP, TLS and SCTP for remote inter-process communication. The service XCM provides is of the connection-oriented, client-server type. It is not a message bus and does not implement the publish-subscribe or broadcast patterns.

    +

    This document primarily serves as an API specification, but also also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Sockets API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    An XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport and BTCP Transport transports provide a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing an XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP, BTCP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP, BTLS and BTCP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) allocates a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of an XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object remains the same across the life-time of the socket.

    +

    In the BSD Sockets API, the socket fd being readable means it's likely, but not guaranteed, that the application can successfully read data from the socket. Similarly, a fd marked writable by for example poll() signifies that the application is likely to be able to write data to the socket.

    +

    An application using non-blocking XCM sockets must always wait for the XCM socket fd to become readable (e.g., the XCM socket fd should always be in the readfds in the select() call), regardless of the target condition. Thus, even if the application is waiting for an opportunity to send a message on a XCM socket, or is not interested in performing any type of operation on the socket, it must wait for the XCM socket fd to become readable. Not being interested in performing any operation here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket.

    +

    An application must always include all of its XCM socket fds into readfds in the select() call. An application must not leave an XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or neither of xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are called when its fd is marked readable by select().

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    The inability to finish the requested operation without blocking the thread (i.e., putting the thread to sleep) is signaled in the typical UNIX manner, by returning an NULL or -1, (depending on the return type) and setting errno to EAGAIN. Unlike most other errno values, EAGAIN is a temporary conditional, and not a terminal error.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the an XCM server socket is in non-blocking mode at the time of an xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on an XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    An XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, TCP, and BTCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided they operate on different sockets. Calls pertaining to the same sockets are not MT safe.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" an XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing an XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of an xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), an xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of an XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    Due to a bug in OpenSSL, partial chains (i.e., where the trust anchor is a trusted non-root certificate) is not allowed when CRL checking is enabled. In OpenSSL terms, X509_V_FLAG_PARTIAL_CHAIN is disabled when X509_V_FLAG_CRL_CHECK_ALL is enabled. Future versions of XCM, built against newer versions of OpenSSL, may allow partial chains in combination with CRL checking.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/api/0.25/inline_umlgraph_pnghtml.pu b/api/0.25/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..3d9fdf388 --- /dev/null +++ b/api/0.25/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(101, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(5, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(6, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/0.25/jquery.js b/api/0.25/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/0.25/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/0.25/menu.js b/api/0.25/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/0.25/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/0.25/menudata.js b/api/0.25/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/api/0.25/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/0.25/minus.svg b/api/0.25/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/0.25/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.25/minusd.svg b/api/0.25/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/0.25/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/0.25/nav_f.png b/api/0.25/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/0.25/nav_f.png differ diff --git a/api/0.25/nav_fd.png b/api/0.25/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/0.25/nav_fd.png differ diff --git a/api/0.25/nav_g.png b/api/0.25/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/0.25/nav_g.png differ diff --git a/api/0.25/nav_h.png b/api/0.25/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/0.25/nav_h.png differ diff --git a/api/0.25/nav_hd.png b/api/0.25/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/0.25/nav_hd.png differ diff --git a/api/0.25/nb_connect_and_send.png b/api/0.25/nb_connect_and_send.png new file mode 100644 index 000000000..ec94eb015 Binary files /dev/null and b/api/0.25/nb_connect_and_send.png differ diff --git a/api/0.25/nb_connect_explicit.png b/api/0.25/nb_connect_explicit.png new file mode 100644 index 000000000..a5df8f3b6 Binary files /dev/null and b/api/0.25/nb_connect_explicit.png differ diff --git a/api/0.25/nb_delayed_connection_refused.png b/api/0.25/nb_delayed_connection_refused.png new file mode 100644 index 000000000..5c216bb18 Binary files /dev/null and b/api/0.25/nb_delayed_connection_refused.png differ diff --git a/api/0.25/nb_flush_buffers_before_close.png b/api/0.25/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/0.25/nb_flush_buffers_before_close.png differ diff --git a/api/0.25/nb_immediate_connection_refused.png b/api/0.25/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/0.25/nb_immediate_connection_refused.png differ diff --git a/api/0.25/open.png b/api/0.25/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/0.25/open.png differ diff --git a/api/0.25/plus.svg b/api/0.25/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/0.25/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.25/plusd.svg b/api/0.25/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/0.25/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/0.25/search/all_0.js b/api/0.25/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/0.25/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/0.25/search/all_1.js b/api/0.25/search/all_1.js new file mode 100644 index 000000000..70206c175 --- /dev/null +++ b/api/0.25/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_14',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_15',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_17',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_18',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_19',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_20',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_21',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/0.25/search/all_10.js b/api/0.25/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/api/0.25/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/0.25/search/all_11.js b/api/0.25/search/all_11.js new file mode 100644 index 000000000..482e3e761 --- /dev/null +++ b/api/0.25/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/0.25/search/all_12.js b/api/0.25/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/api/0.25/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/0.25/search/all_13.js b/api/0.25/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/0.25/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/0.25/search/all_14.js b/api/0.25/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/api/0.25/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.25/search/all_15.js b/api/0.25/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/0.25/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/0.25/search/all_16.js b/api/0.25/search/all_16.js new file mode 100644 index 000000000..fe56ef137 --- /dev/null +++ b/api/0.25/search/all_16.js @@ -0,0 +1,113 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_34',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_35',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_36',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_37',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_38',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_39',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_40',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_41',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_42',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_43',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_44',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_45',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_46',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_47',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_48',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_49',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_50',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_51',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_52',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_53',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_54',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_57',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_58',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_59',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_60',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_61',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_62',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_63',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_64',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_65',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_66',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_67',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_68',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_69',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_70',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_71',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_72',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_73',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_74',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_75',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_76',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_77',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_78',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_79',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_80',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_81',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_82',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_83',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_84',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_85',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_86',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_87',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_88',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_89',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_90',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_91',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_92',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_93',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_94',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_95',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_96',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_97',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_98',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_99',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_100',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_101',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_102',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_103',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_106',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_107',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_108',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_109',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.25/search/all_2.js b/api/0.25/search/all_2.js new file mode 100644 index 000000000..6f594310c --- /dev/null +++ b/api/0.25/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_5',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_6',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_8',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_9',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/0.25/search/all_3.js b/api/0.25/search/all_3.js new file mode 100644 index 000000000..61125c0c2 --- /dev/null +++ b/api/0.25/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/0.25/search/all_4.js b/api/0.25/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/api/0.25/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/0.25/search/all_5.js b/api/0.25/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/api/0.25/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.25/search/all_6.js b/api/0.25/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/api/0.25/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/api/0.25/search/all_7.js b/api/0.25/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/0.25/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/0.25/search/all_8.js b/api/0.25/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/api/0.25/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/0.25/search/all_9.js b/api/0.25/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/api/0.25/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.25/search/all_a.js b/api/0.25/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/api/0.25/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/0.25/search/all_b.js b/api/0.25/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/api/0.25/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/0.25/search/all_c.js b/api/0.25/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/0.25/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/0.25/search/all_d.js b/api/0.25/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/api/0.25/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/0.25/search/all_e.js b/api/0.25/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/0.25/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/0.25/search/all_f.js b/api/0.25/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/0.25/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/0.25/search/classes_0.js b/api/0.25/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/0.25/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/0.25/search/close.svg b/api/0.25/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/0.25/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/0.25/search/defines_0.js b/api/0.25/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/api/0.25/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/0.25/search/enums_0.js b/api/0.25/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/0.25/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.25/search/enumvalues_0.js b/api/0.25/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/api/0.25/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/0.25/search/files_0.js b/api/0.25/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/api/0.25/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/0.25/search/functions_0.js b/api/0.25/search/functions_0.js new file mode 100644 index 000000000..f761fe699 --- /dev/null +++ b/api/0.25/search/functions_0.js @@ -0,0 +1,80 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fis_5fsupported_2',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_3',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_4',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_5',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_12',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_13',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_14',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_15',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_16',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_17',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_18',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_19',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_20',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_23',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_25',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_26',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_27',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_29',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_30',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_31',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_32',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_42',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_43',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_45',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_46',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_47',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_48',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_49',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_50',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_51',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_52',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_53',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_54',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_55',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_56',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_57',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_58',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_59',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_60',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_61',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_62',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_63',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_64',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_65',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_66',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_67',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_68',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_69',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_70',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_71',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_72',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_73',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_74',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_75',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_76',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/0.25/search/groups_0.js b/api/0.25/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/0.25/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/0.25/search/groups_1.js b/api/0.25/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/0.25/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/0.25/search/groups_2.js b/api/0.25/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/0.25/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/0.25/search/mag.svg b/api/0.25/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/0.25/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.25/search/mag_d.svg b/api/0.25/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/0.25/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/0.25/search/mag_sel.svg b/api/0.25/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/0.25/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.25/search/mag_seld.svg b/api/0.25/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/0.25/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/0.25/search/pages_0.js b/api/0.25/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/0.25/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.25/search/pages_1.js b/api/0.25/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/0.25/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.25/search/pages_2.js b/api/0.25/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/0.25/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.25/search/pages_3.js b/api/0.25/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/0.25/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/0.25/search/search.css b/api/0.25/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/0.25/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/0.25/search/search.js b/api/0.25/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/0.25/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.25/structxcm__addr__ip.html b/api/0.25/structxcm__addr__ip.html new file mode 100644 index 000000000..9445f5128 --- /dev/null +++ b/api/0.25/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/0.25/sync_off.png b/api/0.25/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/0.25/sync_off.png differ diff --git a/api/0.25/sync_on.png b/api/0.25/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/0.25/sync_on.png differ diff --git a/api/0.25/tab_a.png b/api/0.25/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/0.25/tab_a.png differ diff --git a/api/0.25/tab_ad.png b/api/0.25/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/0.25/tab_ad.png differ diff --git a/api/0.25/tab_b.png b/api/0.25/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/0.25/tab_b.png differ diff --git a/api/0.25/tab_bd.png b/api/0.25/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/0.25/tab_bd.png differ diff --git a/api/0.25/tab_h.png b/api/0.25/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/0.25/tab_h.png differ diff --git a/api/0.25/tab_hd.png b/api/0.25/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/0.25/tab_hd.png differ diff --git a/api/0.25/tab_s.png b/api/0.25/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/0.25/tab_s.png differ diff --git a/api/0.25/tab_sd.png b/api/0.25/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/0.25/tab_sd.png differ diff --git a/api/0.25/tabs.css b/api/0.25/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/0.25/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/0.25/topics.html b/api/0.25/topics.html new file mode 100644 index 000000000..49570a354 --- /dev/null +++ b/api/0.25/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/0.25/xcm_8h.html b/api/0.25/xcm_8h.html new file mode 100644 index 000000000..64afaa87f --- /dev/null +++ b/api/0.25/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), an xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close an XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Always returns 0.
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to an XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves an XCM socket's file descriptor, for an XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/0.25/xcm_8h_source.html b/api/0.25/xcm_8h_source.html new file mode 100644 index 000000000..d3f039e8f --- /dev/null +++ b/api/0.25/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1450#include <errno.h>
    +
    1451#include <stdbool.h>
    +
    1452#include <stddef.h>
    +
    1453#include <sys/types.h>
    +
    1454#include <xcm_attr_map.h>
    +
    1455
    +
    1457#define XCM_NONBLOCK (1<<0)
    +
    1458
    +
    1465struct xcm_socket;
    +
    1466
    +
    1519struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520
    +
    1542struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543 const struct xcm_attr_map *attrs);
    +
    1544
    +
    1580struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581
    +
    1597struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598 const struct xcm_attr_map *attrs);
    +
    1599
    +
    1615int xcm_close(struct xcm_socket *socket);
    +
    1616
    +
    1636void xcm_cleanup(struct xcm_socket *socket);
    +
    1637
    +
    1656struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1657
    +
    1677struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1678 const struct xcm_attr_map *attrs);
    +
    1679
    +
    1702int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1703 const void *__restrict buf, size_t len);
    +
    1704
    +
    1728int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1729 void *__restrict buf, size_t capacity);
    +
    1730
    +
    1733#define XCM_SO_RECEIVABLE (1<<0)
    +
    1736#define XCM_SO_SENDABLE (1<<1)
    +
    1738#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1739
    +
    1800int xcm_await(struct xcm_socket *socket, int condition);
    +
    1801
    +
    1849int xcm_fd(struct xcm_socket *socket);
    +
    1850
    +
    1896int xcm_finish(struct xcm_socket *socket);
    +
    1897
    +
    1938int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1939
    +
    1954bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1955
    +
    1972const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1973
    +
    1988const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1989
    +
    1990#include <xcm_compat.h>
    +
    1991
    +
    1992#ifdef __cplusplus
    +
    1993}
    +
    1994#endif
    +
    1995#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/0.25/xcm__addr_8h.html b/api/0.25/xcm__addr_8h.html new file mode 100644 index 000000000..b45759cf1 --- /dev/null +++ b/api/0.25/xcm__addr_8h.html @@ -0,0 +1,1267 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <stdbool.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    bool xcm_addr_is_valid (const char *xcm_addr_s)
     
    bool xcm_addr_is_supported (const char *xcm_addr_s)
     
    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_is_valid()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_valid (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is valid.

    +

    Checks if a string is a syntactically correct XCM address for a known (but not necessarily supported) XCM transport.

    +

    The correctness of the complete address is verified, including the transport-specific part (e.g., port number for TCP/IP-based transports).

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid, false if not.
    + +
    +
    + +

    ◆ xcm_addr_is_supported()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_supported (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is a valid and supported.

    +

    Checks if a string is a valid address for an XCM transport supported by this library instance.

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid and supported, false if not.
    + +
    +
    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of an XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/0.25/xcm__addr_8h_source.html b/api/0.25/xcm__addr_8h_source.html new file mode 100644 index 000000000..8fc344f45 --- /dev/null +++ b/api/0.25/xcm__addr_8h_source.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <stdbool.h>
    +
    16#include <sys/socket.h>
    +
    17#include <sys/types.h>
    +
    18
    +
    26#define XCM_UTLS_PROTO "utls"
    +
    29#define XCM_TLS_PROTO "tls"
    +
    31#define XCM_TCP_PROTO "tcp"
    +
    33#define XCM_SCTP_PROTO "sctp"
    +
    36#define XCM_UX_PROTO "ux"
    +
    39#define XCM_UXF_PROTO "uxf"
    +
    40
    +
    43#define XCM_BTLS_PROTO "btls"
    +
    45#define XCM_BTCP_PROTO "btcp"
    +
    46
    +
    47enum xcm_addr_type {
    +
    48 xcm_addr_type_name,
    +
    49 xcm_addr_type_ip
    +
    50};
    +
    51
    +
    + +
    54{
    +
    56 sa_family_t family;
    +
    57
    +
    59 union {
    +
    62 in_addr_t ip4;
    +
    65 uint8_t ip6[16];
    + +
    67};
    +
    +
    68
    +
    + +
    71{
    +
    73 enum xcm_addr_type type;
    +
    74
    +
    76 union {
    +
    77 struct xcm_addr_ip ip;
    +
    78 /* Max DNS name length is 253 characters */
    +
    79 char name[254];
    +
    80 };
    +
    81};
    +
    +
    82
    +
    96bool xcm_addr_is_valid(const char *xcm_addr_s);
    +
    97
    +
    107bool xcm_addr_is_supported(const char *xcm_addr_s);
    +
    108
    +
    122int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    123
    +
    137int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    138 uint16_t *port);
    +
    139
    +
    153int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    170int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    171 uint16_t *port);
    +
    172
    +
    187int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    188 uint16_t *port);
    +
    189
    +
    203int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    204
    +
    218int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    219 size_t capacity);
    +
    220
    +
    234int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    235 uint16_t *port);
    +
    236
    +
    250int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    251 uint16_t *port);
    +
    252
    +
    268int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    269 char *utls_addr_s, size_t capacity);
    +
    270
    +
    286int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    287 char *tls_addr_s, size_t capacity);
    +
    288
    +
    304int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    305 char *tcp_addr_s, size_t capacity);
    +
    306
    +
    322int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    323 char *sctp_addr_s, size_t capacity);
    +
    324
    +
    339int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    340
    +
    355int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    356
    +
    372int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    373 char *btcp_addr_s, size_t capacity);
    +
    374
    +
    390int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    391 char *btls_addr_s, size_t capacity);
    +
    392
    +
    393#include <xcm_addr_compat.h>
    +
    394
    +
    395#ifdef __cplusplus
    +
    396}
    +
    397#endif
    +
    398#endif
    +
    Definition xcm_addr.h:71
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:73
    +
    Definition xcm_addr.h:54
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:56
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:65
    +
    in_addr_t ip4
    Definition xcm_addr.h:62
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    bool xcm_addr_is_supported(const char *xcm_addr_s)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    bool xcm_addr_is_valid(const char *xcm_addr_s)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/0.25/xcm__attr_8h.html b/api/0.25/xcm__attr_8h.html new file mode 100644 index 000000000..611de437f --- /dev/null +++ b/api/0.25/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.25/xcm__attr_8h_source.html b/api/0.25/xcm__attr_8h_source.html new file mode 100644 index 000000000..e2224c183 --- /dev/null +++ b/api/0.25/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.25/xcm__attr__map_8h.html b/api/0.25/xcm__attr__map_8h.html new file mode 100644 index 000000000..448133211 --- /dev/null +++ b/api/0.25/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/0.25/xcm__attr__map_8h_source.html b/api/0.25/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..9f4d24888 --- /dev/null +++ b/api/0.25/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/0.25/xcm__attr__types_8h.html b/api/0.25/xcm__attr__types_8h.html new file mode 100644 index 000000000..73bcb3b9f --- /dev/null +++ b/api/0.25/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/api/0.25/xcm__attr__types_8h_source.html b/api/0.25/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..7a954528f --- /dev/null +++ b/api/0.25/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/0.25/xcm__compat_8h.html b/api/0.25/xcm__compat_8h.html new file mode 100644 index 000000000..9155b57a5 --- /dev/null +++ b/api/0.25/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/0.25/xcm__compat_8h_source.html b/api/0.25/xcm__compat_8h_source.html new file mode 100644 index 000000000..11b27ac34 --- /dev/null +++ b/api/0.25/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/0.25/xcm__version_8h.html b/api/0.25/xcm__version_8h.html new file mode 100644 index 000000000..ace1e1255 --- /dev/null +++ b/api/0.25/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   10
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.10.1"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   25
     
    #define XCM_VERSION_API   "0.25"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/0.25/xcm__version_8h_source.html b/api/0.25/xcm__version_8h_source.html new file mode 100644 index 000000000..3a183ff90 --- /dev/null +++ b/api/0.25/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 10
    +
    29
    +
    31#define XCM_VERSION_PATCH 1
    +
    32
    +
    34#define XCM_VERSION "1.10.1"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 25
    +
    48
    +
    50#define XCM_VERSION_API "0.25"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/head/annotated.html b/api/head/annotated.html new file mode 100644 index 000000000..6b9087cfc --- /dev/null +++ b/api/head/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/head/bc_s.png b/api/head/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/head/bc_s.png differ diff --git a/api/head/bc_sd.png b/api/head/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/head/bc_sd.png differ diff --git a/api/head/classes.html b/api/head/classes.html new file mode 100644 index 000000000..028c9800e --- /dev/null +++ b/api/head/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/head/closed.png b/api/head/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/head/closed.png differ diff --git a/api/head/dir_d44c64559bbebec7f509842c48db8b23.html b/api/head/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..334b8de8e --- /dev/null +++ b/api/head/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     Core XCM API.
     
     xcm_addr.h
     API for parsing and building XCM addresses.
     
     xcm_attr.h
     XCM socket attribute access API.
     
     xcm_attr_map.h
     XCM attribute map API.
     
     xcm_attr_types.h
     XCM attribute value type definitions.
     
     xcm_compat.h
     Obsolete parts of the XCM API.
     
     xcm_version.h
     Functions and macros to retrieve XCM versioning information.
     
    +
    + + + + diff --git a/api/head/doc.svg b/api/head/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/head/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/head/docd.svg b/api/head/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/head/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/head/doxygen.css b/api/head/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/head/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/head/doxygen.svg b/api/head/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/head/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/head/dynsections.js b/api/head/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/head/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/head/files.html b/api/head/files.html new file mode 100644 index 000000000..192d5c639 --- /dev/null +++ b/api/head/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hCore XCM API
     xcm_addr.hAPI for parsing and building XCM addresses
     xcm_attr.hXCM socket attribute access API
     xcm_attr_map.hXCM attribute map API
     xcm_attr_types.hXCM attribute value type definitions
     xcm_compat.hObsolete parts of the XCM API
     xcm_version.hFunctions and macros to retrieve XCM versioning information
    +
    +
    + + + + diff --git a/api/head/folderclosed.svg b/api/head/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/head/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/head/folderclosedd.svg b/api/head/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/head/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/head/folderopen.svg b/api/head/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/head/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/head/folderopend.svg b/api/head/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/head/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/head/functions.html b/api/head/functions.html new file mode 100644 index 000000000..219876d10 --- /dev/null +++ b/api/head/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/head/functions_vars.html b/api/head/functions_vars.html new file mode 100644 index 000000000..04490f6e1 --- /dev/null +++ b/api/head/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/head/globals.html b/api/head/globals.html new file mode 100644 index 000000000..f27f7c592 --- /dev/null +++ b/api/head/globals.html @@ -0,0 +1,196 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/head/globals_defs.html b/api/head/globals_defs.html new file mode 100644 index 000000000..08d90086b --- /dev/null +++ b/api/head/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/head/globals_enum.html b/api/head/globals_enum.html new file mode 100644 index 000000000..96ebb9cea --- /dev/null +++ b/api/head/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/head/globals_eval.html b/api/head/globals_eval.html new file mode 100644 index 000000000..b6e85f1b0 --- /dev/null +++ b/api/head/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/head/globals_func.html b/api/head/globals_func.html new file mode 100644 index 000000000..f92bcca58 --- /dev/null +++ b/api/head/globals_func.html @@ -0,0 +1,166 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/head/globals_type.html b/api/head/globals_type.html new file mode 100644 index 000000000..5f76c8b0f --- /dev/null +++ b/api/head/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/head/group__api__version.html b/api/head/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/api/head/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/head/group__lib__version.html b/api/head/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/api/head/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/head/index.html b/api/head/index.html new file mode 100644 index 000000000..08f886228 --- /dev/null +++ b/api/head/index.html @@ -0,0 +1,758 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.26 [API]
    +
    +1.11.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is a shared library implementing an inter-process communication service on Linux. It facilitates communication between processes on the same system, as well as over a network.

    +

    XCM internals are divided into the core library, and a number of pluggable transports, handling the actual data delivery. In combination with an URL-like addressing scheme, it allows applications to be transport agnostic, and an IPC mechanism suitable for one deployment can seamlessly be replaced with another, in another deployment. The API semantics are the same, regardless of underlying transport used.

    +

    An XCM transport either provides a messaging or a byte stream type service.

    +

    XCM supports UNIX domain sockets for efficient local-only communication, and TCP, TLS and SCTP for remote inter-process communication. The service XCM provides is of the connection-oriented, client-server type. It is not a message bus and does not implement the publish-subscribe or broadcast patterns.

    +

    This document primarily serves as an API specification, but also also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Sockets API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    An XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport and BTCP Transport transports provide a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing an XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP, BTCP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP, BTLS and BTCP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) allocates a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of an XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object remains the same across the life-time of the socket.

    +

    In the BSD Sockets API, the socket fd being readable means it's likely, but not guaranteed, that the application can successfully read data from the socket. Similarly, a fd marked writable by for example poll() signifies that the application is likely to be able to write data to the socket.

    +

    An application using non-blocking XCM sockets must always wait for the XCM socket fd to become readable (e.g., the XCM socket fd should always be in the readfds in the select() call), regardless of the target condition. Thus, even if the application is waiting for an opportunity to send a message on a XCM socket, or is not interested in performing any type of operation on the socket, it must wait for the XCM socket fd to become readable. Not being interested in performing any operation here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket.

    +

    An application must always include all of its XCM socket fds into readfds in the select() call. An application must not leave an XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or neither of xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are called when its fd is marked readable by select().

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    The inability to finish the requested operation without blocking the thread (i.e., putting the thread to sleep) is signaled in the typical UNIX manner, by returning an NULL or -1, (depending on the return type) and setting errno to EAGAIN. Unlike most other errno values, EAGAIN is a temporary conditional, and not a terminal error.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the an XCM server socket is in non-blocking mode at the time of an xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on an XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    An XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Associated to a XCM server or connection socket is a set of XCM socket attributes.

    +

    Socket attributes represent both read-only state (e.g., TCP round-trip time), and read-write run-time configuration (e.g., TCP keepalive configuration).

    +

    Which attributes are present varies across different transports, socket types (i.e., server or connection) and socket states (i.e., fully established or not).

    +

    The socket attribute API <xcm_attr.h> provides access to transport-specific parameters, without the need to extend the API with transport-specific function calls.

    +

    Socket attributes are organized as a tree. An attribute's name is a string which describes a path to a node in the tree. The leaf nodes are one of a number of primitive types, such as integers and strings (see <xcm_attr_types.h> for the full list). Composite (interior) nodes are either dictionaries or lists.

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect_a() call, and read-only thereafter.

    +

    +Attribute Names

    +

    An attribute name (or, path name) is a string consisting of a sequence of dictionary keys and list indices. Keys are separated by a colon ".", and indices are enclosed in square brackes "[<index>]".

    +

    Read from the left, each segment in the path moves one level away from the root.

    +

    Here are some examples of attribute path names:

    xcm.blocking
    +
    tls.peer.cert.san.email[2]
    +

    +Attribute Values

    +

    The attribute's value is coded in the native C data type and native CPU byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type, a type for arbitrary binary data, and a double-precision floating point type. See xcm_attr_types.h for details.

    +

    In the current API, only leaf nodes can be accessed (e.g., it's not possible to retrieve a list or a dictionary as a single call).

    +

    The attribute access API is in xcm_attr.h.

    +

    +Basic Structure

    +

    The socket attribute tree has an unnamed root. This root dictionary has a number of keys.

    +

    The generic XCM attributes, available in all transports, are organized under the "xcm" key. Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp" for TCP-specific attributes applicable to the TLS, BTLS, TCP, and BTCP transports).

    +

    +Attribute Access

    +

    Retrieving the value of an attribute is done using xcm_attr_get(), or any of its many type-specific convenience functions.

    +

    Below is an example of reading an integer attribute value.

    int64_t rtt;
    +
    xcm_attr_get_int(tcp_conn_socket, "tcp.rtt", &rtt);
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +

    Iterating over a list may look something like below.

    int len = xcm_attr_list_len(tls_conn_socket, "tls.peer.cert.san.dns");
    +
    +
    for (int i = 0; i < len; i++) {
    +
    char name[256];
    +
    xcm_attr_getf_str(tls_conn_socket, name, sizeof(name),
    +
    "tls.peer.cert.san.dns[%d]", i);
    +
    printf("DNS subject alternative name: %s\n", name);
    +
    }
    +
    int int int int int xcm_attr_getf_str(struct xcm_socket *socket, char *value, size_t capacity, const char *name_fmt,...) __attribute__((format(printf
    +

    Modyfing the value of an attribute is done using xcm_attr_set(), or any of its many type-specific convenience functions.

    +

    For example, setting the value of a boolean attribyte may be done like below.

    xcm_attr_set_bool(tcp_conn_socket, "tcp.keepalive", false);
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +

    Please note that all of these examples lack the error handling required in a real application.

    +

    +Socket Instantiation Configuration

    +

    An application may modify multiple attributes in one go, as a part of socket creation, by populating an attribute map and passing it to xcm_connect_a(), xcm_server_a(), or xcm_accept_a().

    +

    Certain attributes' default values (e.g., attribute controlling what TLS credentials are used) may only be modified in this manner.

    +

    Each key-value pair in the attribute maps is used as an instruction to set a node in the socket attribute tree to a particular value. The node's path is the key's name, and new desired value of the node is the key's value.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the attribute map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided the threads do not operate on the same socket, at the same time.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" an XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing an XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of an xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), an xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of an XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    Due to a bug in OpenSSL, partial chains (i.e., where the trust anchor is a trusted non-root certificate) is not allowed when CRL checking is enabled. In OpenSSL terms, X509_V_FLAG_PARTIAL_CHAIN is disabled when X509_V_FLAG_CRL_CHECK_ALL is enabled. Future versions of XCM, built against newer versions of OpenSSL, may allow partial chains in combination with CRL checking.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    tls.peer.cert.subject.cn Connection String R The common name (CN) of the remote peer's subject field, provided the certificate (including a CN in the subject DN) exists.
    tls.peer.cert.san.dns Connection List R A list of strings, where each element is a remote peer's subject alternative name (SAN) of the DNS type. The subject field CN is not included in this list.
    tls.peer.cert.san.email Connection List R A list of strings, where each element is a remote peer's SAN of the RFC 822 type.
    tls.peer.cert.san.dirs Connection List R A list of dictionaries. Each element represents is a remote peer's SAN of the directory name type, and contains the key "cn", holding the directory name DN's CN, if the CN is present.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/api/head/inline_umlgraph_pnghtml.pu b/api/head/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..3d9fdf388 --- /dev/null +++ b/api/head/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(101, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(5, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(6, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/head/jquery.js b/api/head/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/head/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/head/menu.js b/api/head/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/head/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/head/menudata.js b/api/head/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/api/head/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/head/minus.svg b/api/head/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/head/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/head/minusd.svg b/api/head/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/head/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/head/nav_f.png b/api/head/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/head/nav_f.png differ diff --git a/api/head/nav_fd.png b/api/head/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/head/nav_fd.png differ diff --git a/api/head/nav_g.png b/api/head/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/head/nav_g.png differ diff --git a/api/head/nav_h.png b/api/head/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/head/nav_h.png differ diff --git a/api/head/nav_hd.png b/api/head/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/head/nav_hd.png differ diff --git a/api/head/nb_connect_and_send.png b/api/head/nb_connect_and_send.png new file mode 100644 index 000000000..ec94eb015 Binary files /dev/null and b/api/head/nb_connect_and_send.png differ diff --git a/api/head/nb_connect_explicit.png b/api/head/nb_connect_explicit.png new file mode 100644 index 000000000..a5df8f3b6 Binary files /dev/null and b/api/head/nb_connect_explicit.png differ diff --git a/api/head/nb_delayed_connection_refused.png b/api/head/nb_delayed_connection_refused.png new file mode 100644 index 000000000..5c216bb18 Binary files /dev/null and b/api/head/nb_delayed_connection_refused.png differ diff --git a/api/head/nb_flush_buffers_before_close.png b/api/head/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/head/nb_flush_buffers_before_close.png differ diff --git a/api/head/nb_immediate_connection_refused.png b/api/head/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/head/nb_immediate_connection_refused.png differ diff --git a/api/head/open.png b/api/head/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/head/open.png differ diff --git a/api/head/plus.svg b/api/head/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/head/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/head/plusd.svg b/api/head/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/head/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/head/search/all_0.js b/api/head/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/head/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/head/search/all_1.js b/api/head/search/all_1.js new file mode 100644 index 000000000..bc32c2b67 --- /dev/null +++ b/api/head/search/all_1.js @@ -0,0 +1,28 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['access_1',['Attribute Access',['../index.html#attribute_access',1,'']]], + ['addr_2',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_3',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_4',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_5',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_6',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_7',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_8',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_9',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_10',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_11',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_12',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_13',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_14',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_15',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_16',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_18',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20access_19',['Attribute Access',['../index.html#attribute_access',1,'']]], + ['attribute_20inheritance_20',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20names_21',['Attribute Names',['../index.html#attribute_names',1,'']]], + ['attribute_20values_22',['Attribute Values',['../index.html#attribute_values',1,'']]], + ['attributes_23',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_24',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/head/search/all_10.js b/api/head/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/api/head/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/head/search/all_11.js b/api/head/search/all_11.js new file mode 100644 index 000000000..086d8632b --- /dev/null +++ b/api/head/search/all_11.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['socket_20instantiation_20configuration_10',['Socket Instantiation Configuration',['../index.html#attr_bulk',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['structure_13',['Basic Structure',['../index.html#attribute_structure',1,'']]], + ['subject_20name_20verification_14',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_15',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_16',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_17',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/head/search/all_12.js b/api/head/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/api/head/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/head/search/all_13.js b/api/head/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/head/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/head/search/all_14.js b/api/head/search/all_14.js new file mode 100644 index 000000000..8aab71ade --- /dev/null +++ b/api/head/search/all_14.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['values_1',['Attribute Values',['../index.html#attribute_values',1,'']]], + ['verification_2',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_3',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/head/search/all_15.js b/api/head/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/head/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/head/search/all_16.js b/api/head/search/all_16.js new file mode 100644 index 000000000..d1220a7ba --- /dev/null +++ b/api/head/search/all_16.js @@ -0,0 +1,120 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5flist_5flen_34',['xcm_attr_get_list_len',['../xcm__attr_8h.html#a4874393871d4fc69ea2afbce3df0fdc1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_35',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_36',['xcm_attr_getf',['../xcm__attr_8h.html#a1314c089ab1ddc73375baa5b253339b6',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbin_37',['xcm_attr_getf_bin',['../xcm__attr_8h.html#a4e27a4d3baff282bb3b58705e989bcb1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbool_38',['xcm_attr_getf_bool',['../xcm__attr_8h.html#a876b571856f0cd276dc1285602dd935e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fdouble_39',['xcm_attr_getf_double',['../xcm__attr_8h.html#abfa1900960965fc6162ab2e0935dd7ef',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fint64_40',['xcm_attr_getf_int64',['../xcm__attr_8h.html#af80f650822a266f975c6b3c312c305fe',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fstr_41',['xcm_attr_getf_str',['../xcm__attr_8h.html#ac039e5ca0eea5ed65ba4b497ccf19063',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_42',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_43',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_44',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_45',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_46',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_47',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_48',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_49',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_50',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_52',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_53',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_54',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_55',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_56',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_57',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_58',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_64',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_65',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_66',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_67',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_68',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_69',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_70',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_71',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_72',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_73',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_74',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_75',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_76',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_77',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_78',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_79',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_80',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_81',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_82',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_83',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_85',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_86',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_87',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_88',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_89',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_90',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_91',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_92',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_93',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_94',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_95',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_96',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_97',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_99',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_100',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_101',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_102',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_103',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_104',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_105',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_106',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_107',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_108',['xcm_version',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_109',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_110',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h'],['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_112',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_113',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_114',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_115',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_116',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/head/search/all_2.js b/api/head/search/all_2.js new file mode 100644 index 000000000..ce79abdd2 --- /dev/null +++ b/api/head/search/all_2.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['basic_20structure_0',['Basic Structure',['../index.html#attribute_structure',1,'']]], + ['before_20close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_2',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_4',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_5',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_6',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_7',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_9',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_10',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/head/search/all_3.js b/api/head/search/all_3.js new file mode 100644 index 000000000..e90ca31ab --- /dev/null +++ b/api/head/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['configuration',['../index.html#tls_role',1,'Role Configuration'],['../index.html#attr_bulk',1,'Socket Instantiation Configuration']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/head/search/all_4.js b/api/head/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/api/head/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/head/search/all_5.js b/api/head/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/api/head/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/head/search/all_6.js b/api/head/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/api/head/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/api/head/search/all_7.js b/api/head/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/head/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/head/search/all_8.js b/api/head/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/api/head/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/head/search/all_9.js b/api/head/search/all_9.js new file mode 100644 index 000000000..08ab27c60 --- /dev/null +++ b/api/head/search/all_9.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['instantiation_20configuration_3',['Socket Instantiation Configuration',['../index.html#attr_bulk',1,'']]], + ['interface_4',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_5',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_6',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_7',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_8',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_10',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_11',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/head/search/all_a.js b/api/head/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/api/head/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/head/search/all_b.js b/api/head/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/api/head/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/head/search/all_c.js b/api/head/search/all_c.js new file mode 100644 index 000000000..e5fecaede --- /dev/null +++ b/api/head/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['message_0',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_1',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_3',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/head/search/all_d.js b/api/head/search/all_d.js new file mode 100644 index 000000000..5d555edcc --- /dev/null +++ b/api/head/search/all_d.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['names_1',['Attribute Names',['../index.html#attribute_names',1,'']]], + ['namespace_2',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_3',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_5',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_6',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_7',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_8',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_9',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_10',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/head/search/all_e.js b/api/head/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/head/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/head/search/all_f.js b/api/head/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/head/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/head/search/classes_0.js b/api/head/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/head/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/head/search/close.svg b/api/head/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/head/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/head/search/defines_0.js b/api/head/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/api/head/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/head/search/enums_0.js b/api/head/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/head/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/head/search/enumvalues_0.js b/api/head/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/api/head/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/head/search/files_0.js b/api/head/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/api/head/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/head/search/functions_0.js b/api/head/search/functions_0.js new file mode 100644 index 000000000..a9a9729de --- /dev/null +++ b/api/head/search/functions_0.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fis_5fsupported_2',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_3',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_4',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_5',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_12',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_13',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_14',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_15',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_16',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_17',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_18',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_19',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_20',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_23',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_25',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_26',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5flist_5flen_27',['xcm_attr_get_list_len',['../xcm__attr_8h.html#a4874393871d4fc69ea2afbce3df0fdc1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_29',['xcm_attr_getf',['../xcm__attr_8h.html#a1314c089ab1ddc73375baa5b253339b6',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbin_30',['xcm_attr_getf_bin',['../xcm__attr_8h.html#a4e27a4d3baff282bb3b58705e989bcb1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbool_31',['xcm_attr_getf_bool',['../xcm__attr_8h.html#a876b571856f0cd276dc1285602dd935e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fdouble_32',['xcm_attr_getf_double',['../xcm__attr_8h.html#abfa1900960965fc6162ab2e0935dd7ef',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fint64_33',['xcm_attr_getf_int64',['../xcm__attr_8h.html#af80f650822a266f975c6b3c312c305fe',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fstr_34',['xcm_attr_getf_str',['../xcm__attr_8h.html#ac039e5ca0eea5ed65ba4b497ccf19063',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_35',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_36',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_37',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_38',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_39',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_40',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_41',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_42',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_43',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_44',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_45',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_46',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_47',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_48',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_49',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_50',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_51',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_52',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_53',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_54',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_55',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_56',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_57',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_58',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_59',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_60',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_61',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_62',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_63',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_64',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_65',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_66',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_67',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_68',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_69',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_70',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_71',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_76',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_77',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_78',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_79',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_80',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_81',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_82',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_83',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/head/search/groups_0.js b/api/head/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/head/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/head/search/groups_1.js b/api/head/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/head/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/head/search/groups_2.js b/api/head/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/head/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/head/search/mag.svg b/api/head/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/head/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/head/search/mag_d.svg b/api/head/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/head/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/head/search/mag_sel.svg b/api/head/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/head/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/head/search/mag_seld.svg b/api/head/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/head/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/head/search/pages_0.js b/api/head/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/head/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/head/search/pages_1.js b/api/head/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/head/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/head/search/pages_2.js b/api/head/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/head/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/head/search/pages_3.js b/api/head/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/head/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/head/search/search.css b/api/head/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/head/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/head/search/search.js b/api/head/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/head/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/head/structxcm__addr__ip.html b/api/head/structxcm__addr__ip.html new file mode 100644 index 000000000..3c9651f41 --- /dev/null +++ b/api/head/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/head/sync_off.png b/api/head/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/head/sync_off.png differ diff --git a/api/head/sync_on.png b/api/head/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/head/sync_on.png differ diff --git a/api/head/tab_a.png b/api/head/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/head/tab_a.png differ diff --git a/api/head/tab_ad.png b/api/head/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/head/tab_ad.png differ diff --git a/api/head/tab_b.png b/api/head/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/head/tab_b.png differ diff --git a/api/head/tab_bd.png b/api/head/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/head/tab_bd.png differ diff --git a/api/head/tab_h.png b/api/head/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/head/tab_h.png differ diff --git a/api/head/tab_hd.png b/api/head/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/head/tab_hd.png differ diff --git a/api/head/tab_s.png b/api/head/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/head/tab_s.png differ diff --git a/api/head/tab_sd.png b/api/head/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/head/tab_sd.png differ diff --git a/api/head/tabs.css b/api/head/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/head/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/head/topics.html b/api/head/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/api/head/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/head/xcm_8h.html b/api/head/xcm_8h.html new file mode 100644 index 000000000..51047c297 --- /dev/null +++ b/api/head/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    Core XCM API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    Core XCM API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), an xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close an XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Always returns 0.
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to an XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves an XCM socket's file descriptor, for an XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/head/xcm_8h_source.html b/api/head/xcm_8h_source.html new file mode 100644 index 000000000..a810628bf --- /dev/null +++ b/api/head/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1525#include <errno.h>
    +
    1526#include <stdbool.h>
    +
    1527#include <stddef.h>
    +
    1528#include <sys/types.h>
    +
    1529#include <xcm_attr_map.h>
    +
    1530
    +
    1532#define XCM_NONBLOCK (1<<0)
    +
    1533
    +
    1540struct xcm_socket;
    +
    1541
    +
    1594struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1595
    +
    1617struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1618 const struct xcm_attr_map *attrs);
    +
    1619
    +
    1655struct xcm_socket *xcm_server(const char *local_addr);
    +
    1656
    +
    1672struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1673 const struct xcm_attr_map *attrs);
    +
    1674
    +
    1690int xcm_close(struct xcm_socket *socket);
    +
    1691
    +
    1711void xcm_cleanup(struct xcm_socket *socket);
    +
    1712
    +
    1731struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1732
    +
    1752struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1753 const struct xcm_attr_map *attrs);
    +
    1754
    +
    1777int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1778 const void *__restrict buf, size_t len);
    +
    1779
    +
    1803int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1804 void *__restrict buf, size_t capacity);
    +
    1805
    +
    1808#define XCM_SO_RECEIVABLE (1<<0)
    +
    1811#define XCM_SO_SENDABLE (1<<1)
    +
    1813#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1814
    +
    1875int xcm_await(struct xcm_socket *socket, int condition);
    +
    1876
    +
    1924int xcm_fd(struct xcm_socket *socket);
    +
    1925
    +
    1971int xcm_finish(struct xcm_socket *socket);
    +
    1972
    +
    2013int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    2014
    +
    2029bool xcm_is_blocking(struct xcm_socket *socket);
    +
    2030
    +
    2047const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    2048
    +
    2063const char *xcm_local_addr(struct xcm_socket *socket);
    +
    2064
    +
    2065#include <xcm_compat.h>
    +
    2066
    +
    2067#ifdef __cplusplus
    +
    2068}
    +
    2069#endif
    +
    2070#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    XCM attribute map API.
    +
    Obsolete parts of the XCM API.
    +
    + + + + diff --git a/api/head/xcm__addr_8h.html b/api/head/xcm__addr_8h.html new file mode 100644 index 000000000..15916cbc1 --- /dev/null +++ b/api/head/xcm__addr_8h.html @@ -0,0 +1,1266 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    API for parsing and building XCM addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <stdbool.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    bool xcm_addr_is_valid (const char *xcm_addr_s)
     
    bool xcm_addr_is_supported (const char *xcm_addr_s)
     
    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    API for parsing and building XCM addresses.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_is_valid()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_valid (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is valid.

    +

    Checks if a string is a syntactically correct XCM address for a known (but not necessarily supported) XCM transport.

    +

    The correctness of the complete address is verified, including the transport-specific part (e.g., port number for TCP/IP-based transports).

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid, false if not.
    + +
    +
    + +

    ◆ xcm_addr_is_supported()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_supported (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is a valid and supported.

    +

    Checks if a string is a valid address for an XCM transport supported by this library instance.

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid and supported, false if not.
    + +
    +
    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of an XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/head/xcm__addr_8h_source.html b/api/head/xcm__addr_8h_source.html new file mode 100644 index 000000000..92bdab8b8 --- /dev/null +++ b/api/head/xcm__addr_8h_source.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <stdbool.h>
    +
    16#include <sys/socket.h>
    +
    17#include <sys/types.h>
    +
    18
    +
    24#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    41#define XCM_BTLS_PROTO "btls"
    +
    43#define XCM_BTCP_PROTO "btcp"
    +
    44
    +
    45enum xcm_addr_type {
    +
    46 xcm_addr_type_name,
    +
    47 xcm_addr_type_ip
    +
    48};
    +
    49
    +
    + +
    52{
    +
    54 sa_family_t family;
    +
    55
    +
    57 union {
    +
    60 in_addr_t ip4;
    +
    63 uint8_t ip6[16];
    + +
    65};
    +
    +
    66
    +
    + +
    69{
    +
    71 enum xcm_addr_type type;
    +
    72
    +
    74 union {
    +
    75 struct xcm_addr_ip ip;
    +
    76 /* Max DNS name length is 253 characters */
    +
    77 char name[254];
    +
    78 };
    +
    79};
    +
    +
    80
    +
    94bool xcm_addr_is_valid(const char *xcm_addr_s);
    +
    95
    +
    105bool xcm_addr_is_supported(const char *xcm_addr_s);
    +
    106
    +
    120int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    121
    +
    135int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    136 uint16_t *port);
    +
    137
    +
    151int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    152 uint16_t *port);
    +
    153
    +
    168int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    169 uint16_t *port);
    +
    170
    +
    185int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    186 uint16_t *port);
    +
    187
    +
    201int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    202
    +
    216int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    217 size_t capacity);
    +
    218
    +
    232int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    233 uint16_t *port);
    +
    234
    +
    248int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    249 uint16_t *port);
    +
    250
    +
    266int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    267 char *utls_addr_s, size_t capacity);
    +
    268
    +
    284int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    285 char *tls_addr_s, size_t capacity);
    +
    286
    +
    302int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    303 char *tcp_addr_s, size_t capacity);
    +
    304
    +
    320int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    321 char *sctp_addr_s, size_t capacity);
    +
    322
    +
    337int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    338
    +
    353int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    354
    +
    370int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    371 char *btcp_addr_s, size_t capacity);
    +
    372
    +
    388int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    389 char *btls_addr_s, size_t capacity);
    +
    390
    +
    391#include <xcm_addr_compat.h>
    +
    392
    +
    393#ifdef __cplusplus
    +
    394}
    +
    395#endif
    +
    396#endif
    +
    Definition xcm_addr.h:69
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:71
    +
    Definition xcm_addr.h:52
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:54
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:63
    +
    in_addr_t ip4
    Definition xcm_addr.h:60
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    bool xcm_addr_is_supported(const char *xcm_addr_s)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    bool xcm_addr_is_valid(const char *xcm_addr_s)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/head/xcm__attr_8h.html b/api/head/xcm__attr_8h.html new file mode 100644 index 000000000..078161bab --- /dev/null +++ b/api/head/xcm__attr_8h.html @@ -0,0 +1,1214 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    XCM socket attribute access API. +More...

    +
    #include <stdbool.h>
    +#include <stdarg.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    int xcm_attr_getf (struct xcm_socket *socket, enum xcm_attr_type *type, void *value, size_t capacity, const char *fmt,...) __attribute__((format(printf
     
    int int xcm_attr_getf_bool (struct xcm_socket *socket, bool *value, const char *name_fmt,...) __attribute__((format(printf
     
    int int int xcm_attr_getf_int64 (struct xcm_socket *socket, int64_t *value, const char *name_fmt,...) __attribute__((format(printf
     
    int int int int xcm_attr_getf_double (struct xcm_socket *socket, double *value, const char *name_fmt,...) __attribute__((format(printf
     
    int int int int int xcm_attr_getf_str (struct xcm_socket *socket, char *value, size_t capacity, const char *name_fmt,...) __attribute__((format(printf
     
    int int int int int int xcm_attr_getf_bin (struct xcm_socket *socket, void *value, size_t capacity, const char *name_fmt,...) __attribute__((format(printf
     
    int int int int int int int xcm_attr_get_list_len (struct xcm_socket *socket, const char *list_name)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    XCM socket attribute access API.

    +

    See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name has an invalid syntax or is too long, or the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    EINVAL The attribute name has an invalid syntax or is too long.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_getf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_getf (struct xcm_socket * socket,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity,
    const char * fmt,
     ... 
    )
    +
    +

    Retrieves the value of a socket attribute using a formatted name.

    +

    This function builds an attribute name using the user-provided format string and arguments, and calls xcm_attr_get().

    +

    xcm_attr_getf() may be used to access a particular element in a list, for example.

    +

    The format string has the same syntax as that of printf().

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    [in]name_fmtThe format string.
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_get() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_getf_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int int xcm_attr_getf_bool (struct xcm_socket * socket,
    bool * value,
    const char * name_fmt,
     ... 
    )
    +
    +

    Retrieves the value of a boolean socket attribute using a formatted name.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]name_fmtThe format string.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_getf_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int int int xcm_attr_getf_int64 (struct xcm_socket * socket,
    int64_t * value,
    const char * name_fmt,
     ... 
    )
    +
    +

    Retrieves the value of an integer socket attribute using a formatted name.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]name_fmtThe format string.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_getf_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int int int int xcm_attr_getf_double (struct xcm_socket * socket,
    double * value,
    const char * name_fmt,
     ... 
    )
    +
    +

    Retrieves the value of a double type socket attribute using a formatted name.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]name_fmtThe format string.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_getf_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int int int int int xcm_attr_getf_str (struct xcm_socket * socket,
    char * value,
    size_t capacity,
    const char * name_fmt,
     ... 
    )
    +
    +

    Retrieves the value of a string socket attribute using a formatted name.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    [in]name_fmtThe format string.
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_getf_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int int int int int int xcm_attr_getf_bin (struct xcm_socket * socket,
    void * value,
    size_t capacity,
    const char * name_fmt,
     ... 
    )
    +
    +

    Retrieves the value of a binary socket attribute using a formatted name.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    [in]name_fmtThe format string.
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_list_len()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int int int int int int int xcm_attr_get_list_len (struct xcm_socket * socket,
    const char * list_name 
    )
    +
    +

    Get the length of a socket attribute list.

    +

    Query the number of elements in a list in the socket attribute tree.

    +
    Parameters
    + + + +
    [in]socketThe connection or server socket.
    [in]list_nameThe name of the attribute list.
    +
    +
    +
    Returns
    Returns the length of the list on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a list.
    EACCES The attribute exists, but is write-only.
    EINVAL The attribute name has an invalid syntax or is too long.
    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves the name, type and current value of all available socket attributes on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/head/xcm__attr_8h_source.html b/api/head/xcm__attr_8h_source.html new file mode 100644 index 000000000..403337f95 --- /dev/null +++ b/api/head/xcm__attr_8h_source.html @@ -0,0 +1,197 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#include <stdbool.h>
    +
    21#include <stdarg.h>
    +
    22#include <xcm.h>
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    47int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    48 enum xcm_attr_type type, const void *value, size_t len);
    +
    49
    +
    62int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    63
    +
    76int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    77 int64_t value);
    +
    78
    +
    91int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    92 double value);
    +
    93
    +
    106int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    107 const char *value);
    +
    108
    +
    135int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    136 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    137
    +
    153int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    154 bool *value);
    +
    155
    +
    172int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    173 int64_t *value);
    +
    174
    +
    191int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    192 double *value);
    +
    193
    +
    212int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    213 char *value, size_t capacity);
    +
    214
    +
    232int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    233 void *value, size_t capacity);
    +
    234
    +
    257int xcm_attr_getf(struct xcm_socket *socket, enum xcm_attr_type *type,
    +
    258 void *value, size_t capacity, const char *fmt, ...)
    +
    259 __attribute__ ((format (printf, 5, 6)));
    +
    260
    +
    276int xcm_attr_getf_bool(struct xcm_socket *socket, bool *value,
    +
    277 const char *name_fmt, ...)
    +
    278 __attribute__ ((format (printf, 3, 4)));
    +
    279
    +
    296int xcm_attr_getf_int64(struct xcm_socket *socket, int64_t *value,
    +
    297 const char *name_fmt, ...)
    +
    298 __attribute__ ((format (printf, 3, 4)));
    +
    299
    +
    316int xcm_attr_getf_double(struct xcm_socket *socket, double *value,
    +
    317 const char *name_fmt, ...)
    +
    318 __attribute__ ((format (printf, 3, 4)));
    +
    319
    +
    338int xcm_attr_getf_str(struct xcm_socket *socket, char *value, size_t capacity,
    +
    339 const char *name_fmt, ...)
    +
    340 __attribute__ ((format (printf, 4, 5)));
    +
    341
    +
    359int xcm_attr_getf_bin(struct xcm_socket *socket, void *value, size_t capacity,
    +
    360 const char *name_fmt, ...)
    +
    361 __attribute__ ((format (printf, 4, 5)));
    +
    362
    +
    381int xcm_attr_get_list_len(struct xcm_socket *socket, const char *list_name);
    +
    382
    +
    384typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    385 void *value, size_t value_len, void *cb_data);
    +
    386
    +
    401void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    402 void *cb_data);
    +
    403
    +
    404#ifdef __cplusplus
    +
    405}
    +
    406#endif
    +
    407#endif
    +
    Core XCM API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_getf(struct xcm_socket *socket, enum xcm_attr_type *type, void *value, size_t capacity, const char *fmt,...) __attribute__((format(printf
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int int int int int int int xcm_attr_get_list_len(struct xcm_socket *socket, const char *list_name)
    +
    int int int int int int xcm_attr_getf_bin(struct xcm_socket *socket, void *value, size_t capacity, const char *name_fmt,...) __attribute__((format(printf
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int int xcm_attr_getf_bool(struct xcm_socket *socket, bool *value, const char *name_fmt,...) __attribute__((format(printf
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int int int int xcm_attr_getf_double(struct xcm_socket *socket, double *value, const char *name_fmt,...) __attribute__((format(printf
    +
    int int int int int xcm_attr_getf_str(struct xcm_socket *socket, char *value, size_t capacity, const char *name_fmt,...) __attribute__((format(printf
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:384
    +
    int int int xcm_attr_getf_int64(struct xcm_socket *socket, int64_t *value, const char *name_fmt,...) __attribute__((format(printf
    +
    XCM attribute value type definitions.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/head/xcm__attr__map_8h.html b/api/head/xcm__attr__map_8h.html new file mode 100644 index 000000000..3a71070fa --- /dev/null +++ b/api/head/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/head/xcm__attr__map_8h_source.html b/api/head/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..45062e701 --- /dev/null +++ b/api/head/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    XCM attribute value type definitions.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/head/xcm__attr__types_8h.html b/api/head/xcm__attr__types_8h.html new file mode 100644 index 000000000..32d225894 --- /dev/null +++ b/api/head/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    XCM attribute value type definitions. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    XCM attribute value type definitions.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/api/head/xcm__attr__types_8h_source.html b/api/head/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..78a37721d --- /dev/null +++ b/api/head/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/head/xcm__compat_8h.html b/api/head/xcm__compat_8h.html new file mode 100644 index 000000000..4d7fa3663 --- /dev/null +++ b/api/head/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    Obsolete parts of the XCM API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    Obsolete parts of the XCM API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/head/xcm__compat_8h_source.html b/api/head/xcm__compat_8h_source.html new file mode 100644 index 000000000..599c1805f --- /dev/null +++ b/api/head/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/head/xcm__version_8h.html b/api/head/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/api/head/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/head/xcm__version_8h_source.html b/api/head/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/api/head/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/api/latest/annotated.html b/api/latest/annotated.html new file mode 100644 index 000000000..ee2fcb65b --- /dev/null +++ b/api/latest/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/api/latest/bc_s.png b/api/latest/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/api/latest/bc_s.png differ diff --git a/api/latest/bc_sd.png b/api/latest/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/api/latest/bc_sd.png differ diff --git a/api/latest/classes.html b/api/latest/classes.html new file mode 100644 index 000000000..44140329e --- /dev/null +++ b/api/latest/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/api/latest/closed.png b/api/latest/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/api/latest/closed.png differ diff --git a/api/latest/dir_d44c64559bbebec7f509842c48db8b23.html b/api/latest/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..2f63bb253 --- /dev/null +++ b/api/latest/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/api/latest/doc.svg b/api/latest/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/api/latest/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/latest/docd.svg b/api/latest/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/api/latest/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/latest/doxygen.css b/api/latest/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/api/latest/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/api/latest/doxygen.svg b/api/latest/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/api/latest/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/latest/dynsections.js b/api/latest/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/api/latest/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/api/latest/files.html b/api/latest/files.html new file mode 100644 index 000000000..9962ed075 --- /dev/null +++ b/api/latest/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/api/latest/folderclosed.svg b/api/latest/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/api/latest/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/latest/folderclosedd.svg b/api/latest/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/api/latest/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/api/latest/folderopen.svg b/api/latest/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/api/latest/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/api/latest/folderopend.svg b/api/latest/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/api/latest/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/api/latest/functions.html b/api/latest/functions.html new file mode 100644 index 000000000..a5c40e5d2 --- /dev/null +++ b/api/latest/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/latest/functions_vars.html b/api/latest/functions_vars.html new file mode 100644 index 000000000..07db7ee1e --- /dev/null +++ b/api/latest/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/api/latest/globals.html b/api/latest/globals.html new file mode 100644 index 000000000..eacb657d4 --- /dev/null +++ b/api/latest/globals.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/latest/globals_defs.html b/api/latest/globals_defs.html new file mode 100644 index 000000000..d29443304 --- /dev/null +++ b/api/latest/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/api/latest/globals_enum.html b/api/latest/globals_enum.html new file mode 100644 index 000000000..89f009863 --- /dev/null +++ b/api/latest/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/api/latest/globals_eval.html b/api/latest/globals_eval.html new file mode 100644 index 000000000..0845fa522 --- /dev/null +++ b/api/latest/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/api/latest/globals_func.html b/api/latest/globals_func.html new file mode 100644 index 000000000..6ffc56053 --- /dev/null +++ b/api/latest/globals_func.html @@ -0,0 +1,159 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/api/latest/globals_type.html b/api/latest/globals_type.html new file mode 100644 index 000000000..ce69036e5 --- /dev/null +++ b/api/latest/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/api/latest/group__api__version.html b/api/latest/group__api__version.html new file mode 100644 index 000000000..a4cb07702 --- /dev/null +++ b/api/latest/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   25
     
    #define XCM_VERSION_API   "0.25"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   25
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.25"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/api/latest/group__lib__version.html b/api/latest/group__lib__version.html new file mode 100644 index 000000000..df0e647ec --- /dev/null +++ b/api/latest/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   10
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.10.1"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   10
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   1
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.10.1"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/api/latest/index.html b/api/latest/index.html new file mode 100644 index 000000000..5e19741f7 --- /dev/null +++ b/api/latest/index.html @@ -0,0 +1,718 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.25 [API]
    +
    +1.10.1 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is a shared library implementing an inter-process communication service on Linux. It facilitates communication between processes on the same system, as well as over a network.

    +

    XCM internals are divided into the core library, and a number of pluggable transports, handling the actual data delivery. In combination with an URL-like addressing scheme, it allows applications to be transport agnostic, and an IPC mechanism suitable for one deployment can seamlessly be replaced with another, in another deployment. The API semantics are the same, regardless of underlying transport used.

    +

    An XCM transport either provides a messaging or a byte stream type service.

    +

    XCM supports UNIX domain sockets for efficient local-only communication, and TCP, TLS and SCTP for remote inter-process communication. The service XCM provides is of the connection-oriented, client-server type. It is not a message bus and does not implement the publish-subscribe or broadcast patterns.

    +

    This document primarily serves as an API specification, but also also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Sockets API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    An XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport and BTCP Transport transports provide a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing an XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP, BTCP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP, BTLS and BTCP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) allocates a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of an XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object remains the same across the life-time of the socket.

    +

    In the BSD Sockets API, the socket fd being readable means it's likely, but not guaranteed, that the application can successfully read data from the socket. Similarly, a fd marked writable by for example poll() signifies that the application is likely to be able to write data to the socket.

    +

    An application using non-blocking XCM sockets must always wait for the XCM socket fd to become readable (e.g., the XCM socket fd should always be in the readfds in the select() call), regardless of the target condition. Thus, even if the application is waiting for an opportunity to send a message on a XCM socket, or is not interested in performing any type of operation on the socket, it must wait for the XCM socket fd to become readable. Not being interested in performing any operation here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket.

    +

    An application must always include all of its XCM socket fds into readfds in the select() call. An application must not leave an XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or neither of xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are called when its fd is marked readable by select().

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    The inability to finish the requested operation without blocking the thread (i.e., putting the thread to sleep) is signaled in the typical UNIX manner, by returning an NULL or -1, (depending on the return type) and setting errno to EAGAIN. Unlike most other errno values, EAGAIN is a temporary conditional, and not a terminal error.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the an XCM server socket is in non-blocking mode at the time of an xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on an XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    An XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, TCP, and BTCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided they operate on different sockets. Calls pertaining to the same sockets are not MT safe.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" an XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing an XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of an xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), an xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of an XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    Due to a bug in OpenSSL, partial chains (i.e., where the trust anchor is a trusted non-root certificate) is not allowed when CRL checking is enabled. In OpenSSL terms, X509_V_FLAG_PARTIAL_CHAIN is disabled when X509_V_FLAG_CRL_CHECK_ALL is enabled. Future versions of XCM, built against newer versions of OpenSSL, may allow partial chains in combination with CRL checking.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/api/latest/inline_umlgraph_pnghtml.pu b/api/latest/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..3d9fdf388 --- /dev/null +++ b/api/latest/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(101, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(5, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(6, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/api/latest/jquery.js b/api/latest/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/api/latest/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/api/latest/menu.js b/api/latest/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/api/latest/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/api/latest/menudata.js b/api/latest/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/api/latest/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/api/latest/minus.svg b/api/latest/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/api/latest/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/latest/minusd.svg b/api/latest/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/api/latest/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/api/latest/nav_f.png b/api/latest/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/api/latest/nav_f.png differ diff --git a/api/latest/nav_fd.png b/api/latest/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/api/latest/nav_fd.png differ diff --git a/api/latest/nav_g.png b/api/latest/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/api/latest/nav_g.png differ diff --git a/api/latest/nav_h.png b/api/latest/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/api/latest/nav_h.png differ diff --git a/api/latest/nav_hd.png b/api/latest/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/api/latest/nav_hd.png differ diff --git a/api/latest/nb_connect_and_send.png b/api/latest/nb_connect_and_send.png new file mode 100644 index 000000000..ec94eb015 Binary files /dev/null and b/api/latest/nb_connect_and_send.png differ diff --git a/api/latest/nb_connect_explicit.png b/api/latest/nb_connect_explicit.png new file mode 100644 index 000000000..a5df8f3b6 Binary files /dev/null and b/api/latest/nb_connect_explicit.png differ diff --git a/api/latest/nb_delayed_connection_refused.png b/api/latest/nb_delayed_connection_refused.png new file mode 100644 index 000000000..5c216bb18 Binary files /dev/null and b/api/latest/nb_delayed_connection_refused.png differ diff --git a/api/latest/nb_flush_buffers_before_close.png b/api/latest/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/api/latest/nb_flush_buffers_before_close.png differ diff --git a/api/latest/nb_immediate_connection_refused.png b/api/latest/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/api/latest/nb_immediate_connection_refused.png differ diff --git a/api/latest/open.png b/api/latest/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/api/latest/open.png differ diff --git a/api/latest/plus.svg b/api/latest/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/api/latest/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/latest/plusd.svg b/api/latest/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/api/latest/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/api/latest/search/all_0.js b/api/latest/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/api/latest/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/api/latest/search/all_1.js b/api/latest/search/all_1.js new file mode 100644 index 000000000..70206c175 --- /dev/null +++ b/api/latest/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_14',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_15',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_17',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_18',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_19',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_20',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_21',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/api/latest/search/all_10.js b/api/latest/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/api/latest/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/api/latest/search/all_11.js b/api/latest/search/all_11.js new file mode 100644 index 000000000..482e3e761 --- /dev/null +++ b/api/latest/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/api/latest/search/all_12.js b/api/latest/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/api/latest/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/api/latest/search/all_13.js b/api/latest/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/api/latest/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/api/latest/search/all_14.js b/api/latest/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/api/latest/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/latest/search/all_15.js b/api/latest/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/api/latest/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/api/latest/search/all_16.js b/api/latest/search/all_16.js new file mode 100644 index 000000000..fe56ef137 --- /dev/null +++ b/api/latest/search/all_16.js @@ -0,0 +1,113 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_34',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_35',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_36',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_37',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_38',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_39',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_40',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_41',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_42',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_43',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_44',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_45',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_46',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_47',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_48',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_49',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_50',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_51',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_52',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_53',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_54',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_57',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_58',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_59',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_60',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_61',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_62',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_63',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_64',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_65',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_66',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_67',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_68',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_69',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_70',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_71',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_72',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_73',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_74',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_75',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_76',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_77',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_78',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_79',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_80',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_81',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_82',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_83',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_84',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_85',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_86',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_87',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_88',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_89',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_90',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_91',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_92',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_93',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_94',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_95',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_96',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_97',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_98',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_99',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_100',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_101',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_102',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_103',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_106',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_107',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_108',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_109',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/latest/search/all_2.js b/api/latest/search/all_2.js new file mode 100644 index 000000000..6f594310c --- /dev/null +++ b/api/latest/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_5',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_6',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_8',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_9',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/api/latest/search/all_3.js b/api/latest/search/all_3.js new file mode 100644 index 000000000..61125c0c2 --- /dev/null +++ b/api/latest/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/api/latest/search/all_4.js b/api/latest/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/api/latest/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/api/latest/search/all_5.js b/api/latest/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/api/latest/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/latest/search/all_6.js b/api/latest/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/api/latest/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/api/latest/search/all_7.js b/api/latest/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/api/latest/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/api/latest/search/all_8.js b/api/latest/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/api/latest/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/api/latest/search/all_9.js b/api/latest/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/api/latest/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/latest/search/all_a.js b/api/latest/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/api/latest/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/api/latest/search/all_b.js b/api/latest/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/api/latest/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/api/latest/search/all_c.js b/api/latest/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/api/latest/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/api/latest/search/all_d.js b/api/latest/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/api/latest/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/api/latest/search/all_e.js b/api/latest/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/api/latest/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/api/latest/search/all_f.js b/api/latest/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/api/latest/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/api/latest/search/classes_0.js b/api/latest/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/api/latest/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/api/latest/search/close.svg b/api/latest/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/api/latest/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/api/latest/search/defines_0.js b/api/latest/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/api/latest/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/api/latest/search/enums_0.js b/api/latest/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/api/latest/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/api/latest/search/enumvalues_0.js b/api/latest/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/api/latest/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/api/latest/search/files_0.js b/api/latest/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/api/latest/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/api/latest/search/functions_0.js b/api/latest/search/functions_0.js new file mode 100644 index 000000000..f761fe699 --- /dev/null +++ b/api/latest/search/functions_0.js @@ -0,0 +1,80 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fis_5fsupported_2',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_3',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_4',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_5',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_12',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_13',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_14',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_15',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_16',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_17',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_18',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_19',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_20',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_23',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_25',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_26',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_27',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_29',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_30',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_31',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_32',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_42',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_43',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_45',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_46',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_47',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_48',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_49',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_50',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_51',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_52',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_53',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_54',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_55',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_56',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_57',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_58',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_59',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_60',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_61',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_62',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_63',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_64',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_65',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_66',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_67',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_68',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_69',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_70',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_71',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_72',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_73',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_74',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_75',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_76',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/api/latest/search/groups_0.js b/api/latest/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/api/latest/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/api/latest/search/groups_1.js b/api/latest/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/api/latest/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/api/latest/search/groups_2.js b/api/latest/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/api/latest/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/api/latest/search/mag.svg b/api/latest/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/api/latest/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/latest/search/mag_d.svg b/api/latest/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/api/latest/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/api/latest/search/mag_sel.svg b/api/latest/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/api/latest/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/latest/search/mag_seld.svg b/api/latest/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/api/latest/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/api/latest/search/pages_0.js b/api/latest/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/api/latest/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/latest/search/pages_1.js b/api/latest/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/api/latest/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/latest/search/pages_2.js b/api/latest/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/api/latest/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/latest/search/pages_3.js b/api/latest/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/api/latest/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/api/latest/search/search.css b/api/latest/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/api/latest/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/api/latest/search/search.js b/api/latest/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/api/latest/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/latest/structxcm__addr__ip.html b/api/latest/structxcm__addr__ip.html new file mode 100644 index 000000000..5b261574e --- /dev/null +++ b/api/latest/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/api/latest/sync_off.png b/api/latest/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/api/latest/sync_off.png differ diff --git a/api/latest/sync_on.png b/api/latest/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/api/latest/sync_on.png differ diff --git a/api/latest/tab_a.png b/api/latest/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/api/latest/tab_a.png differ diff --git a/api/latest/tab_ad.png b/api/latest/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/api/latest/tab_ad.png differ diff --git a/api/latest/tab_b.png b/api/latest/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/api/latest/tab_b.png differ diff --git a/api/latest/tab_bd.png b/api/latest/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/api/latest/tab_bd.png differ diff --git a/api/latest/tab_h.png b/api/latest/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/api/latest/tab_h.png differ diff --git a/api/latest/tab_hd.png b/api/latest/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/api/latest/tab_hd.png differ diff --git a/api/latest/tab_s.png b/api/latest/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/api/latest/tab_s.png differ diff --git a/api/latest/tab_sd.png b/api/latest/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/api/latest/tab_sd.png differ diff --git a/api/latest/tabs.css b/api/latest/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/api/latest/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/api/latest/topics.html b/api/latest/topics.html new file mode 100644 index 000000000..fe9a72f42 --- /dev/null +++ b/api/latest/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/api/latest/xcm_8h.html b/api/latest/xcm_8h.html new file mode 100644 index 000000000..7165b6241 --- /dev/null +++ b/api/latest/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), an xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close an XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Always returns 0.
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to an XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves an XCM socket's file descriptor, for an XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/api/latest/xcm_8h_source.html b/api/latest/xcm_8h_source.html new file mode 100644 index 000000000..b8c82c1d4 --- /dev/null +++ b/api/latest/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1450#include <errno.h>
    +
    1451#include <stdbool.h>
    +
    1452#include <stddef.h>
    +
    1453#include <sys/types.h>
    +
    1454#include <xcm_attr_map.h>
    +
    1455
    +
    1457#define XCM_NONBLOCK (1<<0)
    +
    1458
    +
    1465struct xcm_socket;
    +
    1466
    +
    1519struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520
    +
    1542struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543 const struct xcm_attr_map *attrs);
    +
    1544
    +
    1580struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581
    +
    1597struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598 const struct xcm_attr_map *attrs);
    +
    1599
    +
    1615int xcm_close(struct xcm_socket *socket);
    +
    1616
    +
    1636void xcm_cleanup(struct xcm_socket *socket);
    +
    1637
    +
    1656struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1657
    +
    1677struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1678 const struct xcm_attr_map *attrs);
    +
    1679
    +
    1702int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1703 const void *__restrict buf, size_t len);
    +
    1704
    +
    1728int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1729 void *__restrict buf, size_t capacity);
    +
    1730
    +
    1733#define XCM_SO_RECEIVABLE (1<<0)
    +
    1736#define XCM_SO_SENDABLE (1<<1)
    +
    1738#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1739
    +
    1800int xcm_await(struct xcm_socket *socket, int condition);
    +
    1801
    +
    1849int xcm_fd(struct xcm_socket *socket);
    +
    1850
    +
    1896int xcm_finish(struct xcm_socket *socket);
    +
    1897
    +
    1938int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1939
    +
    1954bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1955
    +
    1972const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1973
    +
    1988const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1989
    +
    1990#include <xcm_compat.h>
    +
    1991
    +
    1992#ifdef __cplusplus
    +
    1993}
    +
    1994#endif
    +
    1995#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/api/latest/xcm__addr_8h.html b/api/latest/xcm__addr_8h.html new file mode 100644 index 000000000..a0f694068 --- /dev/null +++ b/api/latest/xcm__addr_8h.html @@ -0,0 +1,1267 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <stdbool.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    bool xcm_addr_is_valid (const char *xcm_addr_s)
     
    bool xcm_addr_is_supported (const char *xcm_addr_s)
     
    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_is_valid()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_valid (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is valid.

    +

    Checks if a string is a syntactically correct XCM address for a known (but not necessarily supported) XCM transport.

    +

    The correctness of the complete address is verified, including the transport-specific part (e.g., port number for TCP/IP-based transports).

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid, false if not.
    + +
    +
    + +

    ◆ xcm_addr_is_supported()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_supported (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is a valid and supported.

    +

    Checks if a string is a valid address for an XCM transport supported by this library instance.

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid and supported, false if not.
    + +
    +
    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of an XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/api/latest/xcm__addr_8h_source.html b/api/latest/xcm__addr_8h_source.html new file mode 100644 index 000000000..2866802d2 --- /dev/null +++ b/api/latest/xcm__addr_8h_source.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <stdbool.h>
    +
    16#include <sys/socket.h>
    +
    17#include <sys/types.h>
    +
    18
    +
    26#define XCM_UTLS_PROTO "utls"
    +
    29#define XCM_TLS_PROTO "tls"
    +
    31#define XCM_TCP_PROTO "tcp"
    +
    33#define XCM_SCTP_PROTO "sctp"
    +
    36#define XCM_UX_PROTO "ux"
    +
    39#define XCM_UXF_PROTO "uxf"
    +
    40
    +
    43#define XCM_BTLS_PROTO "btls"
    +
    45#define XCM_BTCP_PROTO "btcp"
    +
    46
    +
    47enum xcm_addr_type {
    +
    48 xcm_addr_type_name,
    +
    49 xcm_addr_type_ip
    +
    50};
    +
    51
    +
    + +
    54{
    +
    56 sa_family_t family;
    +
    57
    +
    59 union {
    +
    62 in_addr_t ip4;
    +
    65 uint8_t ip6[16];
    + +
    67};
    +
    +
    68
    +
    + +
    71{
    +
    73 enum xcm_addr_type type;
    +
    74
    +
    76 union {
    +
    77 struct xcm_addr_ip ip;
    +
    78 /* Max DNS name length is 253 characters */
    +
    79 char name[254];
    +
    80 };
    +
    81};
    +
    +
    82
    +
    96bool xcm_addr_is_valid(const char *xcm_addr_s);
    +
    97
    +
    107bool xcm_addr_is_supported(const char *xcm_addr_s);
    +
    108
    +
    122int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    123
    +
    137int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    138 uint16_t *port);
    +
    139
    +
    153int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    170int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    171 uint16_t *port);
    +
    172
    +
    187int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    188 uint16_t *port);
    +
    189
    +
    203int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    204
    +
    218int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    219 size_t capacity);
    +
    220
    +
    234int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    235 uint16_t *port);
    +
    236
    +
    250int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    251 uint16_t *port);
    +
    252
    +
    268int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    269 char *utls_addr_s, size_t capacity);
    +
    270
    +
    286int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    287 char *tls_addr_s, size_t capacity);
    +
    288
    +
    304int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    305 char *tcp_addr_s, size_t capacity);
    +
    306
    +
    322int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    323 char *sctp_addr_s, size_t capacity);
    +
    324
    +
    339int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    340
    +
    355int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    356
    +
    372int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    373 char *btcp_addr_s, size_t capacity);
    +
    374
    +
    390int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    391 char *btls_addr_s, size_t capacity);
    +
    392
    +
    393#include <xcm_addr_compat.h>
    +
    394
    +
    395#ifdef __cplusplus
    +
    396}
    +
    397#endif
    +
    398#endif
    +
    Definition xcm_addr.h:71
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:73
    +
    Definition xcm_addr.h:54
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:56
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:65
    +
    in_addr_t ip4
    Definition xcm_addr.h:62
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    bool xcm_addr_is_supported(const char *xcm_addr_s)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    bool xcm_addr_is_valid(const char *xcm_addr_s)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/api/latest/xcm__attr_8h.html b/api/latest/xcm__attr_8h.html new file mode 100644 index 000000000..8b27ef9c7 --- /dev/null +++ b/api/latest/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/latest/xcm__attr_8h_source.html b/api/latest/xcm__attr_8h_source.html new file mode 100644 index 000000000..15209fb1c --- /dev/null +++ b/api/latest/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/latest/xcm__attr__map_8h.html b/api/latest/xcm__attr__map_8h.html new file mode 100644 index 000000000..7e86e55eb --- /dev/null +++ b/api/latest/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/api/latest/xcm__attr__map_8h_source.html b/api/latest/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..4ad5af159 --- /dev/null +++ b/api/latest/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/api/latest/xcm__attr__types_8h.html b/api/latest/xcm__attr__types_8h.html new file mode 100644 index 000000000..f8235d760 --- /dev/null +++ b/api/latest/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/api/latest/xcm__attr__types_8h_source.html b/api/latest/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..4b4d0a58c --- /dev/null +++ b/api/latest/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/api/latest/xcm__compat_8h.html b/api/latest/xcm__compat_8h.html new file mode 100644 index 000000000..e5bb4f8af --- /dev/null +++ b/api/latest/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/api/latest/xcm__compat_8h_source.html b/api/latest/xcm__compat_8h_source.html new file mode 100644 index 000000000..7a2bcb96e --- /dev/null +++ b/api/latest/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/api/latest/xcm__version_8h.html b/api/latest/xcm__version_8h.html new file mode 100644 index 000000000..d4abdcbf6 --- /dev/null +++ b/api/latest/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   10
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.10.1"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   25
     
    #define XCM_VERSION_API   "0.25"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/api/latest/xcm__version_8h_source.html b/api/latest/xcm__version_8h_source.html new file mode 100644 index 000000000..31786caed --- /dev/null +++ b/api/latest/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 10
    +
    29
    +
    31#define XCM_VERSION_PATCH 1
    +
    32
    +
    34#define XCM_VERSION "1.10.1"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 25
    +
    48
    +
    50#define XCM_VERSION_API "0.25"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.0.0/annotated.html b/doc/v1.0.0/annotated.html new file mode 100644 index 000000000..505e9dc5e --- /dev/null +++ b/doc/v1.0.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.0.0/bc_s.png b/doc/v1.0.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.0.0/bc_s.png differ diff --git a/doc/v1.0.0/bc_sd.png b/doc/v1.0.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.0.0/bc_sd.png differ diff --git a/doc/v1.0.0/classes.html b/doc/v1.0.0/classes.html new file mode 100644 index 000000000..8861c9f37 --- /dev/null +++ b/doc/v1.0.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.0.0/closed.png b/doc/v1.0.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.0.0/closed.png differ diff --git a/doc/v1.0.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.0.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..83ef90f4c --- /dev/null +++ b/doc/v1.0.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,104 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.0.0/doc.svg b/doc/v1.0.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.0.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.0.0/docd.svg b/doc/v1.0.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.0.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.0.0/doxygen.css b/doc/v1.0.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.0.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.0.0/doxygen.svg b/doc/v1.0.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.0.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.0.0/dynsections.js b/doc/v1.0.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.0.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.0.0/files.html b/doc/v1.0.0/files.html new file mode 100644 index 000000000..5a9f4972a --- /dev/null +++ b/doc/v1.0.0/files.html @@ -0,0 +1,91 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.0.0/folderclosed.svg b/doc/v1.0.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.0.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.0.0/folderclosedd.svg b/doc/v1.0.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.0.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.0.0/folderopen.svg b/doc/v1.0.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.0.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.0.0/folderopend.svg b/doc/v1.0.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.0.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.0.0/functions.html b/doc/v1.0.0/functions.html new file mode 100644 index 000000000..ee11706dc --- /dev/null +++ b/doc/v1.0.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.0.0/functions_vars.html b/doc/v1.0.0/functions_vars.html new file mode 100644 index 000000000..c3bb365b3 --- /dev/null +++ b/doc/v1.0.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.0.0/globals.html b/doc/v1.0.0/globals.html new file mode 100644 index 000000000..0a80e102d --- /dev/null +++ b/doc/v1.0.0/globals.html @@ -0,0 +1,131 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.0.0/globals_defs.html b/doc/v1.0.0/globals_defs.html new file mode 100644 index 000000000..b5773ce96 --- /dev/null +++ b/doc/v1.0.0/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.0/globals_enum.html b/doc/v1.0.0/globals_enum.html new file mode 100644 index 000000000..5574de900 --- /dev/null +++ b/doc/v1.0.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.0/globals_eval.html b/doc/v1.0.0/globals_eval.html new file mode 100644 index 000000000..d1cea27bc --- /dev/null +++ b/doc/v1.0.0/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.0/globals_func.html b/doc/v1.0.0/globals_func.html new file mode 100644 index 000000000..814228293 --- /dev/null +++ b/doc/v1.0.0/globals_func.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.0/globals_type.html b/doc/v1.0.0/globals_type.html new file mode 100644 index 000000000..0570d567e --- /dev/null +++ b/doc/v1.0.0/globals_type.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.0/group__api__version.html b/doc/v1.0.0/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.0.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/group__lib__version.html b/doc/v1.0.0/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.0.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/index.html b/doc/v1.0.0/index.html new file mode 100644 index 000000000..33f7980c6 --- /dev/null +++ b/doc/v1.0.0/index.html @@ -0,0 +1,404 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists of of three parts; the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute access API in xcm_attr.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.13 [API]
    +
    +1.0.0 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation has been stable for several years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant follow the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    For example:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempts to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking() or setting the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of read-only key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    The attribute names are strings, and follows a hierarchical naming schema. For example, all generic XCM attributes, expected to be implemented by all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    The attribute value is coded in the native C data types and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are three value types; a boolean type, a 64-bit signed integer type and a string type. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute may look like this (minus error handling):

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Process-wide and/or read/write attributes may be supported in the future.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    xcm.type All String The socket type - "server" or "connection".
    xcm.transport All String The transport type.
    xcm.local_addr All String See xcm_local_addr().
    xcm.remote_addr Connection String See xcm_remote_addr().
    xcm.max_msg_size Connection Integer The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    xcm.from_app_msgs Connection Integer Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) from the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the prescence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h). See the tcp(7) manual page, and its section on the TCP_INFO socket option.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    tcp.rtt Connection Integer The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer The total number of segments received.
    tcp.segs_out Connection Integer The total number of segments sent.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport expect the certificate, trust chain and private key files to be found in a file system directory - the certificate directory. The default path are configured at build-time, but can be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    In case the files in the certificate directory are modified, the new versions of the files will be used by new connections. The TLS transports works with differences between set of files, and thus the new generation of files need not nesserarily be newer (i.e. higher mtime).

    +

    The certificate directory must be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another. One way of achieving an atomic update is to have the certificate directory being a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace with a new one in an atomic manner (i.e. with rename(2)). It's legal to switch back-and-forth between two sets of files, but the time between the back and the forth switch (assuming the atomicity-by-symlink method is used) must be enough to result in different file system modification times on the symbolic link (usually ~10 ms).

    +

    The TLS transport will, at the time of XCM socket creation (xcm_connect() or xcm_server()), look up the process' current network namespace. In case the namespace is given a name per the iproute2 methods and conventions, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In the certificate directory, the TLS transport expects the certificate to follow the below naming convention (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trust chain is stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trust chain in "tc.pem".

    +

    In case the certificate, key or trust chain files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +TLS Socket Attributes

    +

    TLS has all the TCP-level attributes of the TCP transport; see TCP Socket Attributes.

    + + + + + +
    Attribute Name Socket Type Value Type Description
    tls.peer_subject_key_id Connection String The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    Or, in the case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, and to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support, but the application is rather expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/doc/v1.0.0/inline_umlgraph_pnghtml.pu b/doc/v1.0.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/doc/v1.0.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.0.0/jquery.js b/doc/v1.0.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.0.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.0.0/menu.js b/doc/v1.0.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.0.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.0.0/menudata.js b/doc/v1.0.0/menudata.js new file mode 100644 index 000000000..68bf9d308 --- /dev/null +++ b/doc/v1.0.0/menudata.js @@ -0,0 +1,42 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.0.0/minus.svg b/doc/v1.0.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.0.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.0.0/minusd.svg b/doc/v1.0.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.0.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.0.0/nav_f.png b/doc/v1.0.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.0.0/nav_f.png differ diff --git a/doc/v1.0.0/nav_fd.png b/doc/v1.0.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.0.0/nav_fd.png differ diff --git a/doc/v1.0.0/nav_g.png b/doc/v1.0.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.0.0/nav_g.png differ diff --git a/doc/v1.0.0/nav_h.png b/doc/v1.0.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.0.0/nav_h.png differ diff --git a/doc/v1.0.0/nav_hd.png b/doc/v1.0.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.0.0/nav_hd.png differ diff --git a/doc/v1.0.0/nb_connect_and_send.png b/doc/v1.0.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.0.0/nb_connect_and_send.png differ diff --git a/doc/v1.0.0/nb_connect_explicit.png b/doc/v1.0.0/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/doc/v1.0.0/nb_connect_explicit.png differ diff --git a/doc/v1.0.0/nb_delayed_connection_refused.png b/doc/v1.0.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.0.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.0.0/nb_flush_buffers_before_close.png b/doc/v1.0.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.0.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.0.0/nb_immediate_connection_refused.png b/doc/v1.0.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.0.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.0.0/open.png b/doc/v1.0.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.0.0/open.png differ diff --git a/doc/v1.0.0/plus.svg b/doc/v1.0.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.0.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.0.0/plusd.svg b/doc/v1.0.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.0.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.0.0/search/all_0.js b/doc/v1.0.0/search/all_0.js new file mode 100644 index 000000000..8b828638d --- /dev/null +++ b/doc/v1.0.0/search/all_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attributes_12',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/doc/v1.0.0/search/all_1.js b/doc/v1.0.0/search/all_1.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/doc/v1.0.0/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_10.js b/doc/v1.0.0/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/doc/v1.0.0/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_11.js b/doc/v1.0.0/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/doc/v1.0.0/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.0.0/search/all_12.js b/doc/v1.0.0/search/all_12.js new file mode 100644 index 000000000..da47b40a6 --- /dev/null +++ b/doc/v1.0.0/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['utls_20limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_2',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_3',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_4',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_5',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_13.js b/doc/v1.0.0/search/all_13.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.0.0/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_14.js b/doc/v1.0.0/search/all_14.js new file mode 100644 index 000000000..05b0d0c72 --- /dev/null +++ b/doc/v1.0.0/search/all_14.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_2eh_2',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_3',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_4',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_5',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_6',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_7',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_8',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_9',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_10',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_11',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_12',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_13',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_14',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_15',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_16',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_17',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_18',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_19',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_20',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_21',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_22',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_23',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_24',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_25',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_26',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_27',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_28',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_29',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_30',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_31',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_32',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffd_33',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_34',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_35',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_36',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_37',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_38',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_39',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_40',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_41',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_42',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_43',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_44',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_45',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_46',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_47',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_48',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_49',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_50',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_51',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_52',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_53',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_54',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.0/search/all_15.js b/doc/v1.0.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.0.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_16.js b/doc/v1.0.0/search/all_16.js new file mode 100644 index 000000000..d1220a7ba --- /dev/null +++ b/doc/v1.0.0/search/all_16.js @@ -0,0 +1,120 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5flist_5flen_34',['xcm_attr_get_list_len',['../xcm__attr_8h.html#a4874393871d4fc69ea2afbce3df0fdc1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_35',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_36',['xcm_attr_getf',['../xcm__attr_8h.html#a1314c089ab1ddc73375baa5b253339b6',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbin_37',['xcm_attr_getf_bin',['../xcm__attr_8h.html#a4e27a4d3baff282bb3b58705e989bcb1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbool_38',['xcm_attr_getf_bool',['../xcm__attr_8h.html#a876b571856f0cd276dc1285602dd935e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fdouble_39',['xcm_attr_getf_double',['../xcm__attr_8h.html#abfa1900960965fc6162ab2e0935dd7ef',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fint64_40',['xcm_attr_getf_int64',['../xcm__attr_8h.html#af80f650822a266f975c6b3c312c305fe',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fstr_41',['xcm_attr_getf_str',['../xcm__attr_8h.html#ac039e5ca0eea5ed65ba4b497ccf19063',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_42',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_43',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_44',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_45',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_46',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_47',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_48',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_49',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_50',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_52',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_53',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_54',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_55',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_56',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_57',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_58',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_64',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_65',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_66',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_67',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_68',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_69',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_70',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_71',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_72',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_73',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_74',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_75',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_76',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_77',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_78',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_79',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_80',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_81',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_82',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_83',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_85',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_86',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_87',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_88',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_89',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_90',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_91',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_92',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_93',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_94',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_95',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_96',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_97',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_99',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_100',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_101',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_102',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_103',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_104',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_105',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_106',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_107',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_108',['xcm_version',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_109',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_110',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h'],['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_112',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_113',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_114',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_115',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_116',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.0/search/all_2.js b/doc/v1.0.0/search/all_2.js new file mode 100644 index 000000000..5d83b14f7 --- /dev/null +++ b/doc/v1.0.0/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_3',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_6',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_7',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_8',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_9',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_10',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_11',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_12',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_13',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_14',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_3.js b/doc/v1.0.0/search/all_3.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.0.0/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_4.js b/doc/v1.0.0/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.0.0/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_5.js b/doc/v1.0.0/search/all_5.js new file mode 100644 index 000000000..34882611b --- /dev/null +++ b/doc/v1.0.0/search/all_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['finish_2',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_3',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_4',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_6',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_7',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_6.js b/doc/v1.0.0/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/doc/v1.0.0/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_7.js b/doc/v1.0.0/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.0.0/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.0.0/search/all_8.js b/doc/v1.0.0/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/doc/v1.0.0/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_9.js b/doc/v1.0.0/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/doc/v1.0.0/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_a.js b/doc/v1.0.0/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/doc/v1.0.0/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_b.js b/doc/v1.0.0/search/all_b.js new file mode 100644 index 000000000..f955c04ff --- /dev/null +++ b/doc/v1.0.0/search/all_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['message_0',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_4',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_c.js b/doc/v1.0.0/search/all_c.js new file mode 100644 index 000000000..62139819c --- /dev/null +++ b/doc/v1.0.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespaces_1',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['non_20blocking_20connection_20establishment_3',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_4',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_5',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_6',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_d.js b/doc/v1.0.0/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/doc/v1.0.0/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_e.js b/doc/v1.0.0/search/all_e.js new file mode 100644 index 000000000..628cd888d --- /dev/null +++ b/doc/v1.0.0/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['processing_20and_20fork_1',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_3',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.0.0/search/all_f.js b/doc/v1.0.0/search/all_f.js new file mode 100644 index 000000000..f0491624f --- /dev/null +++ b/doc/v1.0.0/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]] +]; diff --git a/doc/v1.0.0/search/classes_0.js b/doc/v1.0.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.0.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/close.svg b/doc/v1.0.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.0.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.0.0/search/defines_0.js b/doc/v1.0.0/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/doc/v1.0.0/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.0.0/search/enums_0.js b/doc/v1.0.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.0.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.0.0/search/enumvalues_0.js b/doc/v1.0.0/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.0.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.0.0/search/files_0.js b/doc/v1.0.0/search/files_0.js new file mode 100644 index 000000000..9ddf96ae9 --- /dev/null +++ b/doc/v1.0.0/search/files_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_3',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_4',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/functions_0.js b/doc/v1.0.0/search/functions_0.js new file mode 100644 index 000000000..96c8a4a8f --- /dev/null +++ b/doc/v1.0.0/search/functions_0.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_1',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_2',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_3',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_4',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_5',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_6',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_7',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_8',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_9',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_10',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_11',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_12',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_13',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_14',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_15',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fawait_16',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_17',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_18',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_19',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffd_20',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_21',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_22',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_23',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_24',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_25',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_26',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_27',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_28',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_29',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.0/search/groups_0.js b/doc/v1.0.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.0.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/groups_1.js b/doc/v1.0.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.0.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/groups_2.js b/doc/v1.0.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.0.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.0.0/search/mag.svg b/doc/v1.0.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.0.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.0.0/search/mag_d.svg b/doc/v1.0.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.0.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.0.0/search/mag_sel.svg b/doc/v1.0.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.0.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.0.0/search/mag_seld.svg b/doc/v1.0.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.0.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.0.0/search/pages_0.js b/doc/v1.0.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.0.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/pages_1.js b/doc/v1.0.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.0.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/pages_2.js b/doc/v1.0.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.0.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/pages_3.js b/doc/v1.0.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.0.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.0/search/search.css b/doc/v1.0.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.0.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.0.0/search/search.js b/doc/v1.0.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.0.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.0.0/structxcm__addr__ip.html b/doc/v1.0.0/structxcm__addr__ip.html new file mode 100644 index 000000000..fba323889 --- /dev/null +++ b/doc/v1.0.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.0.0/sync_off.png b/doc/v1.0.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.0.0/sync_off.png differ diff --git a/doc/v1.0.0/sync_on.png b/doc/v1.0.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.0.0/sync_on.png differ diff --git a/doc/v1.0.0/tab_a.png b/doc/v1.0.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.0.0/tab_a.png differ diff --git a/doc/v1.0.0/tab_ad.png b/doc/v1.0.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.0.0/tab_ad.png differ diff --git a/doc/v1.0.0/tab_b.png b/doc/v1.0.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.0.0/tab_b.png differ diff --git a/doc/v1.0.0/tab_bd.png b/doc/v1.0.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.0.0/tab_bd.png differ diff --git a/doc/v1.0.0/tab_h.png b/doc/v1.0.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.0.0/tab_h.png differ diff --git a/doc/v1.0.0/tab_hd.png b/doc/v1.0.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.0.0/tab_hd.png differ diff --git a/doc/v1.0.0/tab_s.png b/doc/v1.0.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.0.0/tab_s.png differ diff --git a/doc/v1.0.0/tab_sd.png b/doc/v1.0.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.0.0/tab_sd.png differ diff --git a/doc/v1.0.0/tabs.css b/doc/v1.0.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.0.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.0.0/topics.html b/doc/v1.0.0/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.0.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.0.0/xcm_8h.html b/doc/v1.0.0/xcm_8h.html new file mode 100644 index 000000000..d257420f9 --- /dev/null +++ b/doc/v1.0.0/xcm_8h.html @@ -0,0 +1,782 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/xcm_8h_source.html b/doc/v1.0.0/xcm_8h_source.html new file mode 100644 index 000000000..0dd9cf505 --- /dev/null +++ b/doc/v1.0.0/xcm_8h_source.html @@ -0,0 +1,162 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    945#include <errno.h>
    +
    946#include <stdbool.h>
    +
    947#include <sys/types.h>
    +
    948
    +
    950#define XCM_NONBLOCK (1<<0)
    +
    951
    +
    958struct xcm_socket;
    +
    959
    +
    1010struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1011
    +
    1042struct xcm_socket *xcm_server(const char *local_addr);
    +
    1043
    +
    1060int xcm_close(struct xcm_socket *socket);
    +
    1061
    +
    1081void xcm_cleanup(struct xcm_socket *socket);
    +
    1082
    +
    1105struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1106
    +
    1128int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1129
    +
    1152int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1153
    +
    1156#define XCM_SO_RECEIVABLE (1<<0)
    +
    1159#define XCM_SO_SENDABLE (1<<1)
    +
    1161#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1162
    +
    1223int xcm_await(struct xcm_socket *socket, int condition);
    +
    1224
    +
    1266int xcm_fd(struct xcm_socket *socket);
    +
    1267
    +
    1308int xcm_finish(struct xcm_socket *socket);
    +
    1309
    +
    1347int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1348
    +
    1360bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1361
    +
    1375const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1376
    +
    1386const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1387
    +
    1388#include <xcm_compat.h>
    +
    1389
    +
    1390#ifdef __cplusplus
    +
    1391}
    +
    1392#endif
    +
    1393#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.0.0/xcm__addr_8h.html b/doc/v1.0.0/xcm__addr_8h.html new file mode 100644 index 000000000..42a767e01 --- /dev/null +++ b/doc/v1.0.0/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <sys/types.h>
    +#include <sys/socket.h>
    +#include <netinet/in.h>
    +#include <inttypes.h>
    +#include <errno.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/xcm__addr_8h_source.html b/doc/v1.0.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..90004d258 --- /dev/null +++ b/doc/v1.0.0/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <sys/types.h>
    +
    13#include <sys/socket.h>
    +
    14#include <netinet/in.h>
    +
    15#include <inttypes.h>
    +
    16#include <errno.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.0.0/xcm__attr_8h.html b/doc/v1.0.0/xcm__attr_8h.html new file mode 100644 index 000000000..780e043e1 --- /dev/null +++ b/doc/v1.0.0/xcm__attr_8h.html @@ -0,0 +1,241 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <xcm.h>
    +#include <xcm_attr_types.h>
    +#include <stdbool.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + +

    +Functions

    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a XCM socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/xcm__attr_8h_source.html b/doc/v1.0.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..886672d0d --- /dev/null +++ b/doc/v1.0.0/xcm__attr_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <xcm.h>
    +
    19#include <xcm_attr_types.h>
    +
    20#include <stdbool.h>
    +
    21
    +
    46int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48
    +
    50typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51 void *value, size_t value_len, void *cb_data);
    +
    52
    +
    66void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data);
    +
    67
    +
    68#ifdef __cplusplus
    +
    69}
    +
    70#endif
    +
    71#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:50
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.0.0/xcm__attr__map_8h.html b/doc/v1.0.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..3a71070fa --- /dev/null +++ b/doc/v1.0.0/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/xcm__attr__map_8h_source.html b/doc/v1.0.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..45062e701 --- /dev/null +++ b/doc/v1.0.0/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    XCM attribute value type definitions.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.0.0/xcm__attr__types_8h.html b/doc/v1.0.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..9165db428 --- /dev/null +++ b/doc/v1.0.0/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/xcm__attr__types_8h_source.html b/doc/v1.0.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..70e01a5f1 --- /dev/null +++ b/doc/v1.0.0/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.0.0/xcm__compat_8h.html b/doc/v1.0.0/xcm__compat_8h.html new file mode 100644 index 000000000..b67495e7f --- /dev/null +++ b/doc/v1.0.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see io_waiting.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/xcm__compat_8h_source.html b/doc/v1.0.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..84e030661 --- /dev/null +++ b/doc/v1.0.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    118int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    119 size_t capacity);
    +
    120
    +
    121#ifdef __cplusplus
    +
    122}
    +
    123#endif
    +
    124#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.0.0/xcm__version_8h.html b/doc/v1.0.0/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.0.0/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.0.0/xcm__version_8h_source.html b/doc/v1.0.0/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.0.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.0.1/annotated.html b/doc/v1.0.1/annotated.html new file mode 100644 index 000000000..ed6cea521 --- /dev/null +++ b/doc/v1.0.1/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.0.1/bc_s.png b/doc/v1.0.1/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.0.1/bc_s.png differ diff --git a/doc/v1.0.1/bc_sd.png b/doc/v1.0.1/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.0.1/bc_sd.png differ diff --git a/doc/v1.0.1/classes.html b/doc/v1.0.1/classes.html new file mode 100644 index 000000000..e2577d587 --- /dev/null +++ b/doc/v1.0.1/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.0.1/closed.png b/doc/v1.0.1/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.0.1/closed.png differ diff --git a/doc/v1.0.1/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.0.1/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..a7d9f3b8b --- /dev/null +++ b/doc/v1.0.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,104 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.0.1/doc.svg b/doc/v1.0.1/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.0.1/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.0.1/docd.svg b/doc/v1.0.1/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.0.1/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.0.1/doxygen.css b/doc/v1.0.1/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.0.1/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.0.1/doxygen.svg b/doc/v1.0.1/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.0.1/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.0.1/dynsections.js b/doc/v1.0.1/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.0.1/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.0.1/files.html b/doc/v1.0.1/files.html new file mode 100644 index 000000000..97980dcb3 --- /dev/null +++ b/doc/v1.0.1/files.html @@ -0,0 +1,91 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.0.1/folderclosed.svg b/doc/v1.0.1/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.0.1/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.0.1/folderclosedd.svg b/doc/v1.0.1/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.0.1/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.0.1/folderopen.svg b/doc/v1.0.1/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.0.1/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.0.1/folderopend.svg b/doc/v1.0.1/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.0.1/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.0.1/functions.html b/doc/v1.0.1/functions.html new file mode 100644 index 000000000..148a8b310 --- /dev/null +++ b/doc/v1.0.1/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.0.1/functions_vars.html b/doc/v1.0.1/functions_vars.html new file mode 100644 index 000000000..93697e6ba --- /dev/null +++ b/doc/v1.0.1/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.0.1/globals.html b/doc/v1.0.1/globals.html new file mode 100644 index 000000000..e8d7d4bab --- /dev/null +++ b/doc/v1.0.1/globals.html @@ -0,0 +1,131 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.0.1/globals_defs.html b/doc/v1.0.1/globals_defs.html new file mode 100644 index 000000000..c6413bad2 --- /dev/null +++ b/doc/v1.0.1/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.1/globals_enum.html b/doc/v1.0.1/globals_enum.html new file mode 100644 index 000000000..e6c1748a9 --- /dev/null +++ b/doc/v1.0.1/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.1/globals_eval.html b/doc/v1.0.1/globals_eval.html new file mode 100644 index 000000000..39549c8ef --- /dev/null +++ b/doc/v1.0.1/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.1/globals_func.html b/doc/v1.0.1/globals_func.html new file mode 100644 index 000000000..91d90517a --- /dev/null +++ b/doc/v1.0.1/globals_func.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.1/globals_type.html b/doc/v1.0.1/globals_type.html new file mode 100644 index 000000000..b89691761 --- /dev/null +++ b/doc/v1.0.1/globals_type.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.0.1/group__api__version.html b/doc/v1.0.1/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.0.1/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/group__lib__version.html b/doc/v1.0.1/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.0.1/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/index.html b/doc/v1.0.1/index.html new file mode 100644 index 000000000..7098b3aac --- /dev/null +++ b/doc/v1.0.1/index.html @@ -0,0 +1,404 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists of of three parts; the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute access API in xcm_attr.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.13 [API]
    +
    +1.0.1 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant follow the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    For example:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempts to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking() or setting the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of read-only key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    The attribute names are strings, and follows a hierarchical naming schema. For example, all generic XCM attributes, expected to be implemented by all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    The attribute value is coded in the native C data types and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are three value types; a boolean type, a 64-bit signed integer type and a string type. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute may look like this (minus error handling):

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Process-wide and/or read/write attributes may be supported in the future.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    xcm.type All String The socket type - "server" or "connection".
    xcm.transport All String The transport type.
    xcm.local_addr All String See xcm_local_addr().
    xcm.remote_addr Connection String See xcm_remote_addr().
    xcm.max_msg_size Connection Integer The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    xcm.from_app_msgs Connection Integer Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) from the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the prescence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h). See the tcp(7) manual page, and its section on the TCP_INFO socket option.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Description
    tcp.rtt Connection Integer The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer The total number of segments received.
    tcp.segs_out Connection Integer The total number of segments sent.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport expect the certificate, trust chain and private key files to be found in a file system directory - the certificate directory. The default path are configured at build-time, but can be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    In case the files in the certificate directory are modified, the new versions of the files will be used by new connections. The TLS transports works with differences between set of files, and thus the new generation of files need not nesserarily be newer (i.e. higher mtime).

    +

    The certificate directory must be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another. One way of achieving an atomic update is to have the certificate directory being a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace with a new one in an atomic manner (i.e. with rename(2)). It's legal to switch back-and-forth between two sets of files, but the time between the back and the forth switch (assuming the atomicity-by-symlink method is used) must be enough to result in different file system modification times on the symbolic link (usually ~10 ms).

    +

    The TLS transport will, at the time of XCM socket creation (xcm_connect() or xcm_server()), look up the process' current network namespace. In case the namespace is given a name per the iproute2 methods and conventions, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In the certificate directory, the TLS transport expects the certificate to follow the below naming convention (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trust chain is stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trust chain in "tc.pem".

    +

    In case the certificate, key or trust chain files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +TLS Socket Attributes

    +

    TLS has all the TCP-level attributes of the TCP transport; see TCP Socket Attributes.

    + + + + + +
    Attribute Name Socket Type Value Type Description
    tls.peer_subject_key_id Connection String The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    Or, in the case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, and to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support, but the application is rather expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/doc/v1.0.1/inline_umlgraph_pnghtml.pu b/doc/v1.0.1/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/doc/v1.0.1/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.0.1/jquery.js b/doc/v1.0.1/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.0.1/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.0.1/menu.js b/doc/v1.0.1/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.0.1/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.0.1/menudata.js b/doc/v1.0.1/menudata.js new file mode 100644 index 000000000..68bf9d308 --- /dev/null +++ b/doc/v1.0.1/menudata.js @@ -0,0 +1,42 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html"}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.0.1/minus.svg b/doc/v1.0.1/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.0.1/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.0.1/minusd.svg b/doc/v1.0.1/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.0.1/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.0.1/nav_f.png b/doc/v1.0.1/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.0.1/nav_f.png differ diff --git a/doc/v1.0.1/nav_fd.png b/doc/v1.0.1/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.0.1/nav_fd.png differ diff --git a/doc/v1.0.1/nav_g.png b/doc/v1.0.1/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.0.1/nav_g.png differ diff --git a/doc/v1.0.1/nav_h.png b/doc/v1.0.1/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.0.1/nav_h.png differ diff --git a/doc/v1.0.1/nav_hd.png b/doc/v1.0.1/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.0.1/nav_hd.png differ diff --git a/doc/v1.0.1/nb_connect_and_send.png b/doc/v1.0.1/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.0.1/nb_connect_and_send.png differ diff --git a/doc/v1.0.1/nb_connect_explicit.png b/doc/v1.0.1/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/doc/v1.0.1/nb_connect_explicit.png differ diff --git a/doc/v1.0.1/nb_delayed_connection_refused.png b/doc/v1.0.1/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.0.1/nb_delayed_connection_refused.png differ diff --git a/doc/v1.0.1/nb_flush_buffers_before_close.png b/doc/v1.0.1/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.0.1/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.0.1/nb_immediate_connection_refused.png b/doc/v1.0.1/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.0.1/nb_immediate_connection_refused.png differ diff --git a/doc/v1.0.1/open.png b/doc/v1.0.1/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.0.1/open.png differ diff --git a/doc/v1.0.1/plus.svg b/doc/v1.0.1/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.0.1/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.0.1/plusd.svg b/doc/v1.0.1/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.0.1/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.0.1/search/all_0.js b/doc/v1.0.1/search/all_0.js new file mode 100644 index 000000000..8b828638d --- /dev/null +++ b/doc/v1.0.1/search/all_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attributes_12',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/doc/v1.0.1/search/all_1.js b/doc/v1.0.1/search/all_1.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/doc/v1.0.1/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_10.js b/doc/v1.0.1/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/doc/v1.0.1/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_11.js b/doc/v1.0.1/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/doc/v1.0.1/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.0.1/search/all_12.js b/doc/v1.0.1/search/all_12.js new file mode 100644 index 000000000..da47b40a6 --- /dev/null +++ b/doc/v1.0.1/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['utls_20limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_2',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_3',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_4',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_5',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_13.js b/doc/v1.0.1/search/all_13.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.0.1/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_14.js b/doc/v1.0.1/search/all_14.js new file mode 100644 index 000000000..05b0d0c72 --- /dev/null +++ b/doc/v1.0.1/search/all_14.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_2eh_2',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_3',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_4',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_5',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_6',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_7',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_8',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_9',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_10',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_11',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_12',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_13',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_14',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_15',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_16',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_17',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_18',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_19',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_20',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_21',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_22',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_23',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_24',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_25',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_26',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_27',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_28',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_29',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_30',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_31',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_32',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffd_33',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_34',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_35',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_36',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_37',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_38',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_39',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_40',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_41',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_42',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_43',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_44',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_45',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_46',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_47',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_48',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_49',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_50',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_51',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_52',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_53',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_54',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.1/search/all_15.js b/doc/v1.0.1/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.0.1/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_16.js b/doc/v1.0.1/search/all_16.js new file mode 100644 index 000000000..d1220a7ba --- /dev/null +++ b/doc/v1.0.1/search/all_16.js @@ -0,0 +1,120 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5flist_5flen_34',['xcm_attr_get_list_len',['../xcm__attr_8h.html#a4874393871d4fc69ea2afbce3df0fdc1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_35',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_36',['xcm_attr_getf',['../xcm__attr_8h.html#a1314c089ab1ddc73375baa5b253339b6',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbin_37',['xcm_attr_getf_bin',['../xcm__attr_8h.html#a4e27a4d3baff282bb3b58705e989bcb1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbool_38',['xcm_attr_getf_bool',['../xcm__attr_8h.html#a876b571856f0cd276dc1285602dd935e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fdouble_39',['xcm_attr_getf_double',['../xcm__attr_8h.html#abfa1900960965fc6162ab2e0935dd7ef',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fint64_40',['xcm_attr_getf_int64',['../xcm__attr_8h.html#af80f650822a266f975c6b3c312c305fe',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fstr_41',['xcm_attr_getf_str',['../xcm__attr_8h.html#ac039e5ca0eea5ed65ba4b497ccf19063',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_42',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_43',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_44',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_45',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_46',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_47',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_48',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_49',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_50',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_52',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_53',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_54',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_55',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_56',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_57',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_58',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_64',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_65',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_66',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_67',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_68',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_69',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_70',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_71',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_72',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_73',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_74',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_75',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_76',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_77',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_78',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_79',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_80',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_81',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_82',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_83',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_85',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_86',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_87',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_88',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_89',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_90',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_91',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_92',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_93',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_94',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_95',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_96',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_97',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_99',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_100',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_101',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_102',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_103',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_104',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_105',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_106',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_107',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_108',['xcm_version',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_109',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_110',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h'],['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_112',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_113',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_114',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_115',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_116',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.1/search/all_2.js b/doc/v1.0.1/search/all_2.js new file mode 100644 index 000000000..5d83b14f7 --- /dev/null +++ b/doc/v1.0.1/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_3',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_6',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_7',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_8',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_9',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_10',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_11',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_12',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_13',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_14',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_3.js b/doc/v1.0.1/search/all_3.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.0.1/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_4.js b/doc/v1.0.1/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.0.1/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_5.js b/doc/v1.0.1/search/all_5.js new file mode 100644 index 000000000..34882611b --- /dev/null +++ b/doc/v1.0.1/search/all_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['finish_2',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_3',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_4',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_6',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_7',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_6.js b/doc/v1.0.1/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/doc/v1.0.1/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_7.js b/doc/v1.0.1/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.0.1/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.0.1/search/all_8.js b/doc/v1.0.1/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/doc/v1.0.1/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_9.js b/doc/v1.0.1/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/doc/v1.0.1/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_a.js b/doc/v1.0.1/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/doc/v1.0.1/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_b.js b/doc/v1.0.1/search/all_b.js new file mode 100644 index 000000000..f955c04ff --- /dev/null +++ b/doc/v1.0.1/search/all_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['message_0',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_2',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_4',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_c.js b/doc/v1.0.1/search/all_c.js new file mode 100644 index 000000000..62139819c --- /dev/null +++ b/doc/v1.0.1/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespaces_1',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['non_20blocking_20connection_20establishment_3',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_4',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_5',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_6',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_d.js b/doc/v1.0.1/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/doc/v1.0.1/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_e.js b/doc/v1.0.1/search/all_e.js new file mode 100644 index 000000000..628cd888d --- /dev/null +++ b/doc/v1.0.1/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['processing_20and_20fork_1',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_3',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.0.1/search/all_f.js b/doc/v1.0.1/search/all_f.js new file mode 100644 index 000000000..f0491624f --- /dev/null +++ b/doc/v1.0.1/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]] +]; diff --git a/doc/v1.0.1/search/classes_0.js b/doc/v1.0.1/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.0.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/close.svg b/doc/v1.0.1/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.0.1/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.0.1/search/defines_0.js b/doc/v1.0.1/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/doc/v1.0.1/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.0.1/search/enums_0.js b/doc/v1.0.1/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.0.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.0.1/search/enumvalues_0.js b/doc/v1.0.1/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.0.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.0.1/search/files_0.js b/doc/v1.0.1/search/files_0.js new file mode 100644 index 000000000..9ddf96ae9 --- /dev/null +++ b/doc/v1.0.1/search/files_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_3',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_4',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/functions_0.js b/doc/v1.0.1/search/functions_0.js new file mode 100644 index 000000000..96c8a4a8f --- /dev/null +++ b/doc/v1.0.1/search/functions_0.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_1',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_2',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_3',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_4',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_5',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_6',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_7',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_8',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_9',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_10',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_11',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_12',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_13',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_14',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_15',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fawait_16',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_17',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_18',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_19',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5ffd_20',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_21',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_22',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_23',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_24',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_25',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_26',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_27',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fset_5fblocking_28',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_29',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.0.1/search/groups_0.js b/doc/v1.0.1/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.0.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/groups_1.js b/doc/v1.0.1/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.0.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/groups_2.js b/doc/v1.0.1/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.0.1/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.0.1/search/mag.svg b/doc/v1.0.1/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.0.1/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.0.1/search/mag_d.svg b/doc/v1.0.1/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.0.1/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.0.1/search/mag_sel.svg b/doc/v1.0.1/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.0.1/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.0.1/search/mag_seld.svg b/doc/v1.0.1/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.0.1/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.0.1/search/pages_0.js b/doc/v1.0.1/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.0.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/pages_1.js b/doc/v1.0.1/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.0.1/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/pages_2.js b/doc/v1.0.1/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.0.1/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/pages_3.js b/doc/v1.0.1/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.0.1/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.0.1/search/search.css b/doc/v1.0.1/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.0.1/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.0.1/search/search.js b/doc/v1.0.1/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.0.1/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.0.1/structxcm__addr__ip.html b/doc/v1.0.1/structxcm__addr__ip.html new file mode 100644 index 000000000..6178c47a7 --- /dev/null +++ b/doc/v1.0.1/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.0.1/sync_off.png b/doc/v1.0.1/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.0.1/sync_off.png differ diff --git a/doc/v1.0.1/sync_on.png b/doc/v1.0.1/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.0.1/sync_on.png differ diff --git a/doc/v1.0.1/tab_a.png b/doc/v1.0.1/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.0.1/tab_a.png differ diff --git a/doc/v1.0.1/tab_ad.png b/doc/v1.0.1/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.0.1/tab_ad.png differ diff --git a/doc/v1.0.1/tab_b.png b/doc/v1.0.1/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.0.1/tab_b.png differ diff --git a/doc/v1.0.1/tab_bd.png b/doc/v1.0.1/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.0.1/tab_bd.png differ diff --git a/doc/v1.0.1/tab_h.png b/doc/v1.0.1/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.0.1/tab_h.png differ diff --git a/doc/v1.0.1/tab_hd.png b/doc/v1.0.1/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.0.1/tab_hd.png differ diff --git a/doc/v1.0.1/tab_s.png b/doc/v1.0.1/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.0.1/tab_s.png differ diff --git a/doc/v1.0.1/tab_sd.png b/doc/v1.0.1/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.0.1/tab_sd.png differ diff --git a/doc/v1.0.1/tabs.css b/doc/v1.0.1/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.0.1/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.0.1/topics.html b/doc/v1.0.1/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.0.1/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.0.1/xcm_8h.html b/doc/v1.0.1/xcm_8h.html new file mode 100644 index 000000000..459eb8fa7 --- /dev/null +++ b/doc/v1.0.1/xcm_8h.html @@ -0,0 +1,782 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/xcm_8h_source.html b/doc/v1.0.1/xcm_8h_source.html new file mode 100644 index 000000000..c5d4d5811 --- /dev/null +++ b/doc/v1.0.1/xcm_8h_source.html @@ -0,0 +1,162 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    945#include <errno.h>
    +
    946#include <stdbool.h>
    +
    947#include <sys/types.h>
    +
    948
    +
    950#define XCM_NONBLOCK (1<<0)
    +
    951
    +
    958struct xcm_socket;
    +
    959
    +
    1010struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1011
    +
    1042struct xcm_socket *xcm_server(const char *local_addr);
    +
    1043
    +
    1060int xcm_close(struct xcm_socket *socket);
    +
    1061
    +
    1081void xcm_cleanup(struct xcm_socket *socket);
    +
    1082
    +
    1105struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1106
    +
    1128int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1129
    +
    1152int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1153
    +
    1156#define XCM_SO_RECEIVABLE (1<<0)
    +
    1159#define XCM_SO_SENDABLE (1<<1)
    +
    1161#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1162
    +
    1223int xcm_await(struct xcm_socket *socket, int condition);
    +
    1224
    +
    1266int xcm_fd(struct xcm_socket *socket);
    +
    1267
    +
    1308int xcm_finish(struct xcm_socket *socket);
    +
    1309
    +
    1347int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1348
    +
    1360bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1361
    +
    1375const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1376
    +
    1386const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1387
    +
    1388#include <xcm_compat.h>
    +
    1389
    +
    1390#ifdef __cplusplus
    +
    1391}
    +
    1392#endif
    +
    1393#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.0.1/xcm__addr_8h.html b/doc/v1.0.1/xcm__addr_8h.html new file mode 100644 index 000000000..e78b0f463 --- /dev/null +++ b/doc/v1.0.1/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <sys/types.h>
    +#include <sys/socket.h>
    +#include <netinet/in.h>
    +#include <inttypes.h>
    +#include <errno.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/xcm__addr_8h_source.html b/doc/v1.0.1/xcm__addr_8h_source.html new file mode 100644 index 000000000..a477cd03a --- /dev/null +++ b/doc/v1.0.1/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <sys/types.h>
    +
    13#include <sys/socket.h>
    +
    14#include <netinet/in.h>
    +
    15#include <inttypes.h>
    +
    16#include <errno.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.0.1/xcm__attr_8h.html b/doc/v1.0.1/xcm__attr_8h.html new file mode 100644 index 000000000..68614dc7c --- /dev/null +++ b/doc/v1.0.1/xcm__attr_8h.html @@ -0,0 +1,241 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <xcm.h>
    +#include <xcm_attr_types.h>
    +#include <stdbool.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + +

    +Functions

    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a XCM socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/xcm__attr_8h_source.html b/doc/v1.0.1/xcm__attr_8h_source.html new file mode 100644 index 000000000..3c5100e73 --- /dev/null +++ b/doc/v1.0.1/xcm__attr_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <xcm.h>
    +
    19#include <xcm_attr_types.h>
    +
    20#include <stdbool.h>
    +
    21
    +
    46int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    47 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    48
    +
    50typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    51 void *value, size_t value_len, void *cb_data);
    +
    52
    +
    66void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data);
    +
    67
    +
    68#ifdef __cplusplus
    +
    69}
    +
    70#endif
    +
    71#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:50
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.0.1/xcm__attr__map_8h.html b/doc/v1.0.1/xcm__attr__map_8h.html new file mode 100644 index 000000000..3a71070fa --- /dev/null +++ b/doc/v1.0.1/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/xcm__attr__map_8h_source.html b/doc/v1.0.1/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..45062e701 --- /dev/null +++ b/doc/v1.0.1/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    XCM attribute value type definitions.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.0.1/xcm__attr__types_8h.html b/doc/v1.0.1/xcm__attr__types_8h.html new file mode 100644 index 000000000..7b72e263a --- /dev/null +++ b/doc/v1.0.1/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/xcm__attr__types_8h_source.html b/doc/v1.0.1/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..0d5712d93 --- /dev/null +++ b/doc/v1.0.1/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.0.1/xcm__compat_8h.html b/doc/v1.0.1/xcm__compat_8h.html new file mode 100644 index 000000000..c6204cbb0 --- /dev/null +++ b/doc/v1.0.1/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see io_waiting.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/xcm__compat_8h_source.html b/doc/v1.0.1/xcm__compat_8h_source.html new file mode 100644 index 000000000..b39651002 --- /dev/null +++ b/doc/v1.0.1/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    118int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    119 size_t capacity);
    +
    120
    +
    121#ifdef __cplusplus
    +
    122}
    +
    123#endif
    +
    124#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.0.1/xcm__version_8h.html b/doc/v1.0.1/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.0.1/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.0.1/xcm__version_8h_source.html b/doc/v1.0.1/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.0.1/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.1.0/annotated.html b/doc/v1.1.0/annotated.html new file mode 100644 index 000000000..d3fbce61d --- /dev/null +++ b/doc/v1.1.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.1.0/bc_s.png b/doc/v1.1.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.1.0/bc_s.png differ diff --git a/doc/v1.1.0/bc_sd.png b/doc/v1.1.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.1.0/bc_sd.png differ diff --git a/doc/v1.1.0/classes.html b/doc/v1.1.0/classes.html new file mode 100644 index 000000000..c45386bb4 --- /dev/null +++ b/doc/v1.1.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.1.0/closed.png b/doc/v1.1.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.1.0/closed.png differ diff --git a/doc/v1.1.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.1.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..dadb90963 --- /dev/null +++ b/doc/v1.1.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.1.0/doc.svg b/doc/v1.1.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.1.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.1.0/docd.svg b/doc/v1.1.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.1.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.1.0/doxygen.css b/doc/v1.1.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.1.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.1.0/doxygen.svg b/doc/v1.1.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.1.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.1.0/dynsections.js b/doc/v1.1.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.1.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.1.0/files.html b/doc/v1.1.0/files.html new file mode 100644 index 000000000..e7ec7fa5a --- /dev/null +++ b/doc/v1.1.0/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.1.0/folderclosed.svg b/doc/v1.1.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.1.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.1.0/folderclosedd.svg b/doc/v1.1.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.1.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.1.0/folderopen.svg b/doc/v1.1.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.1.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.1.0/folderopend.svg b/doc/v1.1.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.1.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.1.0/functions.html b/doc/v1.1.0/functions.html new file mode 100644 index 000000000..485870e4d --- /dev/null +++ b/doc/v1.1.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.1.0/functions_vars.html b/doc/v1.1.0/functions_vars.html new file mode 100644 index 000000000..c080a5f84 --- /dev/null +++ b/doc/v1.1.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.1.0/globals.html b/doc/v1.1.0/globals.html new file mode 100644 index 000000000..3e36c1897 --- /dev/null +++ b/doc/v1.1.0/globals.html @@ -0,0 +1,158 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.1.0/globals_defs.html b/doc/v1.1.0/globals_defs.html new file mode 100644 index 000000000..4ca3d5a04 --- /dev/null +++ b/doc/v1.1.0/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.1.0/globals_enum.html b/doc/v1.1.0/globals_enum.html new file mode 100644 index 000000000..bd5be54c7 --- /dev/null +++ b/doc/v1.1.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.1.0/globals_eval.html b/doc/v1.1.0/globals_eval.html new file mode 100644 index 000000000..fc6eeed2c --- /dev/null +++ b/doc/v1.1.0/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.1.0/globals_func.html b/doc/v1.1.0/globals_func.html new file mode 100644 index 000000000..40d7236e7 --- /dev/null +++ b/doc/v1.1.0/globals_func.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.1.0/globals_type.html b/doc/v1.1.0/globals_type.html new file mode 100644 index 000000000..45f4b23f3 --- /dev/null +++ b/doc/v1.1.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.1.0/group__api__version.html b/doc/v1.1.0/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.1.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/group__lib__version.html b/doc/v1.1.0/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.1.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/index.html b/doc/v1.1.0/index.html new file mode 100644 index 000000000..e4c64ce93 --- /dev/null +++ b/doc/v1.1.0/index.html @@ -0,0 +1,509 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.15 [API]
    +
    +1.1.0 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    An example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport expect the certificate, trust chain and private key files to be found in a file system directory - the certificate directory. The default path are configured at build-time, but can be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    In case the files in the certificate directory are modified, the new versions of the files will be used by new connections. The TLS transports works with differences between set of files, and thus the new generation of files need not nesserarily be newer (i.e. higher mtime).

    +

    The certificate directory must be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another. One way of achieving an atomic update is to have the certificate directory being a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace with a new one in an atomic manner (i.e. with rename(2)). It's legal to switch back-and-forth between two sets of files, but the time between the back and the forth switch (assuming the atomicity-by-symlink method is used) must be enough to result in different file system modification times on the symbolic link (usually ~10 ms).

    +

    The TLS transport will, at the time of XCM socket creation (xcm_connect() or xcm_server()), look up the process' current network namespace. In case the namespace is given a name per the iproute2 methods and conventions, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In the certificate directory, the TLS transport expects the certificate to follow the below naming convention (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trust chain is stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trust chain in "tc.pem".

    +

    In case the certificate, key or trust chain files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +TLS Socket Attributes

    +

    TLS has all the TCP-level attributes of the TCP transport; see TCP Socket Attributes.

    + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    Or, in the case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/doc/v1.1.0/inline_umlgraph_pnghtml.pu b/doc/v1.1.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/doc/v1.1.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.1.0/jquery.js b/doc/v1.1.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.1.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.1.0/menu.js b/doc/v1.1.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.1.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.1.0/menudata.js b/doc/v1.1.0/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.1.0/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.1.0/minus.svg b/doc/v1.1.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.1.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.1.0/minusd.svg b/doc/v1.1.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.1.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.1.0/nav_f.png b/doc/v1.1.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.1.0/nav_f.png differ diff --git a/doc/v1.1.0/nav_fd.png b/doc/v1.1.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.1.0/nav_fd.png differ diff --git a/doc/v1.1.0/nav_g.png b/doc/v1.1.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.1.0/nav_g.png differ diff --git a/doc/v1.1.0/nav_h.png b/doc/v1.1.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.1.0/nav_h.png differ diff --git a/doc/v1.1.0/nav_hd.png b/doc/v1.1.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.1.0/nav_hd.png differ diff --git a/doc/v1.1.0/nb_connect_and_send.png b/doc/v1.1.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.1.0/nb_connect_and_send.png differ diff --git a/doc/v1.1.0/nb_connect_explicit.png b/doc/v1.1.0/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/doc/v1.1.0/nb_connect_explicit.png differ diff --git a/doc/v1.1.0/nb_delayed_connection_refused.png b/doc/v1.1.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.1.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.1.0/nb_flush_buffers_before_close.png b/doc/v1.1.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.1.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.1.0/nb_immediate_connection_refused.png b/doc/v1.1.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.1.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.1.0/open.png b/doc/v1.1.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.1.0/open.png differ diff --git a/doc/v1.1.0/plus.svg b/doc/v1.1.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.1.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.1.0/plusd.svg b/doc/v1.1.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.1.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.1.0/search/all_0.js b/doc/v1.1.0/search/all_0.js new file mode 100644 index 000000000..4c74c64dd --- /dev/null +++ b/doc/v1.1.0/search/all_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/doc/v1.1.0/search/all_1.js b/doc/v1.1.0/search/all_1.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/doc/v1.1.0/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_10.js b/doc/v1.1.0/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/doc/v1.1.0/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_11.js b/doc/v1.1.0/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/doc/v1.1.0/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.1.0/search/all_12.js b/doc/v1.1.0/search/all_12.js new file mode 100644 index 000000000..da47b40a6 --- /dev/null +++ b/doc/v1.1.0/search/all_12.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['utls_20limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_2',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_3',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_4',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_5',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_13.js b/doc/v1.1.0/search/all_13.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.1.0/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_14.js b/doc/v1.1.0/search/all_14.js new file mode 100644 index 000000000..7ea6a908f --- /dev/null +++ b/doc/v1.1.0/search/all_14.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_2',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_3',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_4',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_5',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_19',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_20',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_23',['xcm_attr_get_bool',['../xcm__attr_8h.html#af56192a489902f0b672f9d80f727c6db',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_24',['xcm_attr_get_int64',['../xcm__attr_8h.html#a9dc368c8e5800c6427935d5031d377bd',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_25',['xcm_attr_get_str',['../xcm__attr_8h.html#aaae1fd6d48381a5c6b3f301aa93e0db4',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_26',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_27',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_28',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_29',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_30',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_31',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_32',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_33',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_34',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_35',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_36',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_37',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_38',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_39',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_40',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_41',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_42',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_43',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_44',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_45',['xcm_attr_set_bool',['../xcm__attr_8h.html#ac8033ada81b2a404a803c2d651b2ba60',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_46',['xcm_attr_set_int64',['../xcm__attr_8h.html#a04fd6fe3d498515a5d4979b2bbb42c83',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_47',['xcm_attr_set_str',['../xcm__attr_8h.html#afb84c5dbcc633d9827ab07bd25d5bbd2',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_48',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_49',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_50',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_51',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_52',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_53',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_54',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_55',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_56',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_57',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_58',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_59',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_60',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_61',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_62',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_63',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_64',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_65',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_66',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_67',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_68',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_69',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_70',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_71',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_72',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_73',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_74',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_75',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_76',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_77',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_78',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_79',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_80',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_81',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_82',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_83',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.1.0/search/all_15.js b/doc/v1.1.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.1.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_16.js b/doc/v1.1.0/search/all_16.js new file mode 100644 index 000000000..d1220a7ba --- /dev/null +++ b/doc/v1.1.0/search/all_16.js @@ -0,0 +1,120 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5flist_5flen_34',['xcm_attr_get_list_len',['../xcm__attr_8h.html#a4874393871d4fc69ea2afbce3df0fdc1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_35',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_36',['xcm_attr_getf',['../xcm__attr_8h.html#a1314c089ab1ddc73375baa5b253339b6',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbin_37',['xcm_attr_getf_bin',['../xcm__attr_8h.html#a4e27a4d3baff282bb3b58705e989bcb1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbool_38',['xcm_attr_getf_bool',['../xcm__attr_8h.html#a876b571856f0cd276dc1285602dd935e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fdouble_39',['xcm_attr_getf_double',['../xcm__attr_8h.html#abfa1900960965fc6162ab2e0935dd7ef',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fint64_40',['xcm_attr_getf_int64',['../xcm__attr_8h.html#af80f650822a266f975c6b3c312c305fe',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fstr_41',['xcm_attr_getf_str',['../xcm__attr_8h.html#ac039e5ca0eea5ed65ba4b497ccf19063',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_42',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_43',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_44',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_45',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_46',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_47',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_48',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_49',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_50',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_52',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_53',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_54',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_55',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_56',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_57',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_58',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_64',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_65',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_66',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_67',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_68',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_69',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_70',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_71',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_72',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_73',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_74',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_75',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_76',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_77',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_78',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_79',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_80',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_81',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_82',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_83',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_85',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_86',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_87',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_88',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_89',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_90',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_91',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_92',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_93',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_94',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_95',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_96',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_97',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_99',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_100',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_101',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_102',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_103',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_104',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_105',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_106',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_107',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_108',['xcm_version',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_109',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_110',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h'],['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_112',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_113',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_114',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_115',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_116',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.1.0/search/all_2.js b/doc/v1.1.0/search/all_2.js new file mode 100644 index 000000000..5d83b14f7 --- /dev/null +++ b/doc/v1.1.0/search/all_2.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['close_1',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_3',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_6',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_7',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_8',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_9',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_10',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_11',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_12',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_13',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_14',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_3.js b/doc/v1.1.0/search/all_3.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.1.0/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_4.js b/doc/v1.1.0/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.1.0/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_5.js b/doc/v1.1.0/search/all_5.js new file mode 100644 index 000000000..34882611b --- /dev/null +++ b/doc/v1.1.0/search/all_5.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['finish_2',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_3',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_4',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_6',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_7',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_6.js b/doc/v1.1.0/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/doc/v1.1.0/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_7.js b/doc/v1.1.0/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.1.0/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.1.0/search/all_8.js b/doc/v1.1.0/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/doc/v1.1.0/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_9.js b/doc/v1.1.0/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/doc/v1.1.0/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_a.js b/doc/v1.1.0/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/doc/v1.1.0/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_b.js b/doc/v1.1.0/search/all_b.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/doc/v1.1.0/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_c.js b/doc/v1.1.0/search/all_c.js new file mode 100644 index 000000000..62139819c --- /dev/null +++ b/doc/v1.1.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespaces_1',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['non_20blocking_20connection_20establishment_3',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_4',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_5',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_6',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_d.js b/doc/v1.1.0/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/doc/v1.1.0/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_e.js b/doc/v1.1.0/search/all_e.js new file mode 100644 index 000000000..628cd888d --- /dev/null +++ b/doc/v1.1.0/search/all_e.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['processing_20and_20fork_1',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_3',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.1.0/search/all_f.js b/doc/v1.1.0/search/all_f.js new file mode 100644 index 000000000..f0491624f --- /dev/null +++ b/doc/v1.1.0/search/all_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]] +]; diff --git a/doc/v1.1.0/search/classes_0.js b/doc/v1.1.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.1.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/close.svg b/doc/v1.1.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.1.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.1.0/search/defines_0.js b/doc/v1.1.0/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/doc/v1.1.0/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.1.0/search/enums_0.js b/doc/v1.1.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.1.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.1.0/search/enumvalues_0.js b/doc/v1.1.0/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.1.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.1.0/search/files_0.js b/doc/v1.1.0/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/doc/v1.1.0/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/functions_0.js b/doc/v1.1.0/search/functions_0.js new file mode 100644 index 000000000..0d0bef284 --- /dev/null +++ b/doc/v1.1.0/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#a225a543ef40cbfa5da1c860cfbcb4152',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_17',['xcm_attr_get_bool',['../xcm__attr_8h.html#af56192a489902f0b672f9d80f727c6db',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_18',['xcm_attr_get_int64',['../xcm__attr_8h.html#a9dc368c8e5800c6427935d5031d377bd',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_19',['xcm_attr_get_str',['../xcm__attr_8h.html#aaae1fd6d48381a5c6b3f301aa93e0db4',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_20',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_21',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_22',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_23',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_24',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_25',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_26',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_27',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_28',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_29',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_30',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_31',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_32',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_33',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_34',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_35',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_36',['xcm_attr_set',['../xcm__attr_8h.html#a24fc9562ced814651160a5783ddb21c7',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_37',['xcm_attr_set_bool',['../xcm__attr_8h.html#ac8033ada81b2a404a803c2d651b2ba60',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_38',['xcm_attr_set_int64',['../xcm__attr_8h.html#a04fd6fe3d498515a5d4979b2bbb42c83',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_39',['xcm_attr_set_str',['../xcm__attr_8h.html#afb84c5dbcc633d9827ab07bd25d5bbd2',1,'xcm_attr.h']]], + ['xcm_5fawait_40',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_41',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_42',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_43',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_44',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_45',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_46',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_47',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_48',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_49',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_50',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_51',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_52',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_53',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_54',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.1.0/search/groups_0.js b/doc/v1.1.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.1.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/groups_1.js b/doc/v1.1.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.1.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/groups_2.js b/doc/v1.1.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.1.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.1.0/search/mag.svg b/doc/v1.1.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.1.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.1.0/search/mag_d.svg b/doc/v1.1.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.1.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.1.0/search/mag_sel.svg b/doc/v1.1.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.1.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.1.0/search/mag_seld.svg b/doc/v1.1.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.1.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.1.0/search/pages_0.js b/doc/v1.1.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.1.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/pages_1.js b/doc/v1.1.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.1.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/pages_2.js b/doc/v1.1.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.1.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/pages_3.js b/doc/v1.1.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.1.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.1.0/search/search.css b/doc/v1.1.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.1.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.1.0/search/search.js b/doc/v1.1.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.1.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.1.0/structxcm__addr__ip.html b/doc/v1.1.0/structxcm__addr__ip.html new file mode 100644 index 000000000..51a6f9770 --- /dev/null +++ b/doc/v1.1.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.1.0/sync_off.png b/doc/v1.1.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.1.0/sync_off.png differ diff --git a/doc/v1.1.0/sync_on.png b/doc/v1.1.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.1.0/sync_on.png differ diff --git a/doc/v1.1.0/tab_a.png b/doc/v1.1.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.1.0/tab_a.png differ diff --git a/doc/v1.1.0/tab_ad.png b/doc/v1.1.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.1.0/tab_ad.png differ diff --git a/doc/v1.1.0/tab_b.png b/doc/v1.1.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.1.0/tab_b.png differ diff --git a/doc/v1.1.0/tab_bd.png b/doc/v1.1.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.1.0/tab_bd.png differ diff --git a/doc/v1.1.0/tab_h.png b/doc/v1.1.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.1.0/tab_h.png differ diff --git a/doc/v1.1.0/tab_hd.png b/doc/v1.1.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.1.0/tab_hd.png differ diff --git a/doc/v1.1.0/tab_s.png b/doc/v1.1.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.1.0/tab_s.png differ diff --git a/doc/v1.1.0/tab_sd.png b/doc/v1.1.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.1.0/tab_sd.png differ diff --git a/doc/v1.1.0/tabs.css b/doc/v1.1.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.1.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.1.0/topics.html b/doc/v1.1.0/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.1.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.1.0/xcm_8h.html b/doc/v1.1.0/xcm_8h.html new file mode 100644 index 000000000..0f975aa7d --- /dev/null +++ b/doc/v1.1.0/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/xcm_8h_source.html b/doc/v1.1.0/xcm_8h_source.html new file mode 100644 index 000000000..c8c8498e1 --- /dev/null +++ b/doc/v1.1.0/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    991#include <errno.h>
    +
    992#include <stdbool.h>
    +
    993#include <sys/types.h>
    +
    994
    +
    995#include <xcm_attr_map.h>
    +
    996
    +
    998#define XCM_NONBLOCK (1<<0)
    +
    999
    +
    1006struct xcm_socket;
    +
    1007
    +
    1058struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1059
    +
    1081struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1082 const struct xcm_attr_map *attrs);
    +
    1083
    +
    1114struct xcm_socket *xcm_server(const char *local_addr);
    +
    1115
    +
    1131struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1132 const struct xcm_attr_map *attrs);
    +
    1133
    +
    1150int xcm_close(struct xcm_socket *socket);
    +
    1151
    +
    1171void xcm_cleanup(struct xcm_socket *socket);
    +
    1172
    +
    1195struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1196
    +
    1213struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1214 const struct xcm_attr_map *attrs);
    +
    1215
    +
    1237int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1238
    +
    1261int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1262
    +
    1265#define XCM_SO_RECEIVABLE (1<<0)
    +
    1268#define XCM_SO_SENDABLE (1<<1)
    +
    1270#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1271
    +
    1332int xcm_await(struct xcm_socket *socket, int condition);
    +
    1333
    +
    1375int xcm_fd(struct xcm_socket *socket);
    +
    1376
    +
    1417int xcm_finish(struct xcm_socket *socket);
    +
    1418
    +
    1459int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1460
    +
    1475bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1476
    +
    1493const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1494
    +
    1509const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1510
    +
    1511#include <xcm_compat.h>
    +
    1512
    +
    1513#ifdef __cplusplus
    +
    1514}
    +
    1515#endif
    +
    1516#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.1.0/xcm__addr_8h.html b/doc/v1.1.0/xcm__addr_8h.html new file mode 100644 index 000000000..80742c16a --- /dev/null +++ b/doc/v1.1.0/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/xcm__addr_8h_source.html b/doc/v1.1.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..d1af1f2d0 --- /dev/null +++ b/doc/v1.1.0/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.1.0/xcm__attr_8h.html b/doc/v1.1.0/xcm__attr_8h.html new file mode 100644 index 000000000..a7fb1d5db --- /dev/null +++ b/doc/v1.1.0/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *s, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *s, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *s, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *s, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *s, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *s, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * s,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]value_lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * s,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * s,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * s,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * s,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * s,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * s,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * s,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/xcm__attr_8h_source.html b/doc/v1.1.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..dca477264 --- /dev/null +++ b/doc/v1.1.0/xcm__attr_8h_source.html @@ -0,0 +1,149 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *s, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *s, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *s, const char *name, int64_t value);
    +
    74
    +
    87int xcm_attr_set_str(struct xcm_socket *s, const char *name,
    +
    88 const char *value);
    +
    89
    +
    115int xcm_attr_get(struct xcm_socket *s, const char *name,
    +
    116 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    117
    +
    134int xcm_attr_get_bool(struct xcm_socket *s, const char *name,
    +
    135 bool *value);
    +
    136
    +
    153int xcm_attr_get_int64(struct xcm_socket *s, const char *name,
    +
    154 int64_t *value);
    +
    155
    +
    174int xcm_attr_get_str(struct xcm_socket *s, const char *name,
    +
    175 char *value, size_t capacity);
    +
    176
    +
    178typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    179 void *value, size_t value_len, void *cb_data);
    +
    180
    +
    194void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data);
    +
    195
    +
    196#ifdef __cplusplus
    +
    197}
    +
    198#endif
    +
    199#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_int64(struct xcm_socket *s, const char *name, int64_t value)
    +
    int xcm_attr_get(struct xcm_socket *s, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_set(struct xcm_socket *s, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_get_int64(struct xcm_socket *s, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *s, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_bool(struct xcm_socket *s, const char *name, bool value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:178
    +
    int xcm_attr_get_bool(struct xcm_socket *s, const char *name, bool *value)
    +
    int xcm_attr_set_str(struct xcm_socket *s, const char *name, const char *value)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.1.0/xcm__attr__map_8h.html b/doc/v1.1.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..90cef8d15 --- /dev/null +++ b/doc/v1.1.0/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]attr_mapThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/xcm__attr__map_8h_source.html b/doc/v1.1.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..4665c1a70 --- /dev/null +++ b/doc/v1.1.0/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.1.0/xcm__attr__types_8h.html b/doc/v1.1.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..0b63eb4de --- /dev/null +++ b/doc/v1.1.0/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/xcm__attr__types_8h_source.html b/doc/v1.1.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..1a4a6afd0 --- /dev/null +++ b/doc/v1.1.0/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.1.0/xcm__compat_8h.html b/doc/v1.1.0/xcm__compat_8h.html new file mode 100644 index 000000000..0bf521806 --- /dev/null +++ b/doc/v1.1.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging. For the quirks of xcm_want(), see io_waiting.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/xcm__compat_8h_source.html b/doc/v1.1.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..7165179d7 --- /dev/null +++ b/doc/v1.1.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    118int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    119 size_t capacity);
    +
    120
    +
    121#ifdef __cplusplus
    +
    122}
    +
    123#endif
    +
    124#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.1.0/xcm__version_8h.html b/doc/v1.1.0/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.1.0/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.1.0/xcm__version_8h_source.html b/doc/v1.1.0/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.1.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.10.0/annotated.html b/doc/v1.10.0/annotated.html new file mode 100644 index 000000000..85b61e40e --- /dev/null +++ b/doc/v1.10.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.10.0/bc_s.png b/doc/v1.10.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.10.0/bc_s.png differ diff --git a/doc/v1.10.0/bc_sd.png b/doc/v1.10.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.10.0/bc_sd.png differ diff --git a/doc/v1.10.0/classes.html b/doc/v1.10.0/classes.html new file mode 100644 index 000000000..fa49437c5 --- /dev/null +++ b/doc/v1.10.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.10.0/closed.png b/doc/v1.10.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.10.0/closed.png differ diff --git a/doc/v1.10.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.10.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..2f2fec1ef --- /dev/null +++ b/doc/v1.10.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.10.0/doc.svg b/doc/v1.10.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.10.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.10.0/docd.svg b/doc/v1.10.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.10.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.10.0/doxygen.css b/doc/v1.10.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.10.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.10.0/doxygen.svg b/doc/v1.10.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.10.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.10.0/dynsections.js b/doc/v1.10.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.10.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.10.0/files.html b/doc/v1.10.0/files.html new file mode 100644 index 000000000..4f9557ea8 --- /dev/null +++ b/doc/v1.10.0/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.10.0/folderclosed.svg b/doc/v1.10.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.10.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.10.0/folderclosedd.svg b/doc/v1.10.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.10.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.10.0/folderopen.svg b/doc/v1.10.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.10.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.10.0/folderopend.svg b/doc/v1.10.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.10.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.10.0/functions.html b/doc/v1.10.0/functions.html new file mode 100644 index 000000000..1668e0b33 --- /dev/null +++ b/doc/v1.10.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.10.0/functions_vars.html b/doc/v1.10.0/functions_vars.html new file mode 100644 index 000000000..065c0ee8c --- /dev/null +++ b/doc/v1.10.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.10.0/globals.html b/doc/v1.10.0/globals.html new file mode 100644 index 000000000..3974d455d --- /dev/null +++ b/doc/v1.10.0/globals.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.10.0/globals_defs.html b/doc/v1.10.0/globals_defs.html new file mode 100644 index 000000000..9667d2648 --- /dev/null +++ b/doc/v1.10.0/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.10.0/globals_enum.html b/doc/v1.10.0/globals_enum.html new file mode 100644 index 000000000..17aa6b66e --- /dev/null +++ b/doc/v1.10.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.10.0/globals_eval.html b/doc/v1.10.0/globals_eval.html new file mode 100644 index 000000000..5ed311ea9 --- /dev/null +++ b/doc/v1.10.0/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.10.0/globals_func.html b/doc/v1.10.0/globals_func.html new file mode 100644 index 000000000..0e70fb2d9 --- /dev/null +++ b/doc/v1.10.0/globals_func.html @@ -0,0 +1,159 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.10.0/globals_type.html b/doc/v1.10.0/globals_type.html new file mode 100644 index 000000000..17ff31e6a --- /dev/null +++ b/doc/v1.10.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.10.0/group__api__version.html b/doc/v1.10.0/group__api__version.html new file mode 100644 index 000000000..77f558ebc --- /dev/null +++ b/doc/v1.10.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   25
     
    #define XCM_VERSION_API   "0.25"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   25
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.25"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/group__lib__version.html b/doc/v1.10.0/group__lib__version.html new file mode 100644 index 000000000..f092bb544 --- /dev/null +++ b/doc/v1.10.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   10
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.10.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   10
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.10.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/index.html b/doc/v1.10.0/index.html new file mode 100644 index 000000000..22527710a --- /dev/null +++ b/doc/v1.10.0/index.html @@ -0,0 +1,718 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.25 [API]
    +
    +1.10.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is a shared library implementing an inter-process communication service on Linux. It facilitates communication between processes on the same system, as well as over a network.

    +

    XCM internals are divided into the core library, and a number of pluggable transports, handling the actual data delivery. In combination with an URL-like addressing scheme, it allows applications to be transport agnostic, and an IPC mechanism suitable for one deployment can seamlessly be replaced with another, in another deployment. The API semantics are the same, regardless of underlying transport used.

    +

    An XCM transport either provides a messaging or a byte stream type service.

    +

    XCM supports UNIX domain sockets for efficient local-only communication, and TCP, TLS and SCTP for remote inter-process communication. The service XCM provides is of the connection-oriented, client-server type. It is not a message bus and does not implement the publish-subscribe or broadcast patterns.

    +

    This document primarily serves as an API specification, but also also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Sockets API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    An XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport and BTCP Transport transports provide a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing an XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP, BTCP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP, BTLS and BTCP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) allocates a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of an XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object remains the same across the life-time of the socket.

    +

    In the BSD Sockets API, the socket fd being readable means it's likely, but not guaranteed, that the application can successfully read data from the socket. Similarly, a fd marked writable by for example poll() signifies that the application is likely to be able to write data to the socket.

    +

    An application using non-blocking XCM sockets must always wait for the XCM socket fd to become readable (e.g., the XCM socket fd should always be in the readfds in the select() call), regardless of the target condition. Thus, even if the application is waiting for an opportunity to send a message on a XCM socket, or is not interested in performing any type of operation on the socket, it must wait for the XCM socket fd to become readable. Not being interested in performing any operation here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket.

    +

    An application must always include all of its XCM socket fds into readfds in the select() call. An application must not leave an XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or neither of xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are called when its fd is marked readable by select().

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    The inability to finish the requested operation without blocking the thread (i.e., putting the thread to sleep) is signaled in the typical UNIX manner, by returning an NULL or -1, (depending on the return type) and setting errno to EAGAIN. Unlike most other errno values, EAGAIN is a temporary conditional, and not a terminal error.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the an XCM server socket is in non-blocking mode at the time of an xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on an XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    An XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, TCP, and BTCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided they operate on different sockets. Calls pertaining to the same sockets are not MT safe.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" an XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing an XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of an xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), an xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of an XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    Due to a bug in OpenSSL, partial chains (i.e., where the trust anchor is a trusted non-root certificate) is not allowed when CRL checking is enabled. In OpenSSL terms, X509_V_FLAG_PARTIAL_CHAIN is disabled when X509_V_FLAG_CRL_CHECK_ALL is enabled. Future versions of XCM, built against newer versions of OpenSSL, may allow partial chains in combination with CRL checking.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/doc/v1.10.0/inline_umlgraph_pnghtml.pu b/doc/v1.10.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..3d9fdf388 --- /dev/null +++ b/doc/v1.10.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(101, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(5, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(6, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.10.0/jquery.js b/doc/v1.10.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.10.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.10.0/menu.js b/doc/v1.10.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.10.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.10.0/menudata.js b/doc/v1.10.0/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/doc/v1.10.0/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.10.0/minus.svg b/doc/v1.10.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.10.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.10.0/minusd.svg b/doc/v1.10.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.10.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.10.0/nav_f.png b/doc/v1.10.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.10.0/nav_f.png differ diff --git a/doc/v1.10.0/nav_fd.png b/doc/v1.10.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.10.0/nav_fd.png differ diff --git a/doc/v1.10.0/nav_g.png b/doc/v1.10.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.10.0/nav_g.png differ diff --git a/doc/v1.10.0/nav_h.png b/doc/v1.10.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.10.0/nav_h.png differ diff --git a/doc/v1.10.0/nav_hd.png b/doc/v1.10.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.10.0/nav_hd.png differ diff --git a/doc/v1.10.0/nb_connect_and_send.png b/doc/v1.10.0/nb_connect_and_send.png new file mode 100644 index 000000000..ec94eb015 Binary files /dev/null and b/doc/v1.10.0/nb_connect_and_send.png differ diff --git a/doc/v1.10.0/nb_connect_explicit.png b/doc/v1.10.0/nb_connect_explicit.png new file mode 100644 index 000000000..a5df8f3b6 Binary files /dev/null and b/doc/v1.10.0/nb_connect_explicit.png differ diff --git a/doc/v1.10.0/nb_delayed_connection_refused.png b/doc/v1.10.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..5c216bb18 Binary files /dev/null and b/doc/v1.10.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.10.0/nb_flush_buffers_before_close.png b/doc/v1.10.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.10.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.10.0/nb_immediate_connection_refused.png b/doc/v1.10.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.10.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.10.0/open.png b/doc/v1.10.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.10.0/open.png differ diff --git a/doc/v1.10.0/plus.svg b/doc/v1.10.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.10.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.10.0/plusd.svg b/doc/v1.10.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.10.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.10.0/search/all_0.js b/doc/v1.10.0/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.10.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_1.js b/doc/v1.10.0/search/all_1.js new file mode 100644 index 000000000..70206c175 --- /dev/null +++ b/doc/v1.10.0/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_14',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_15',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_17',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_18',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_19',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_20',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_21',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_10.js b/doc/v1.10.0/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/doc/v1.10.0/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_11.js b/doc/v1.10.0/search/all_11.js new file mode 100644 index 000000000..482e3e761 --- /dev/null +++ b/doc/v1.10.0/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_12.js b/doc/v1.10.0/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/doc/v1.10.0/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.10.0/search/all_13.js b/doc/v1.10.0/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.10.0/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_14.js b/doc/v1.10.0/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/doc/v1.10.0/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_15.js b/doc/v1.10.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.10.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_16.js b/doc/v1.10.0/search/all_16.js new file mode 100644 index 000000000..fe56ef137 --- /dev/null +++ b/doc/v1.10.0/search/all_16.js @@ -0,0 +1,113 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_34',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_35',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_36',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_37',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_38',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_39',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_40',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_41',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_42',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_43',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_44',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_45',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_46',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_47',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_48',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_49',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_50',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_51',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_52',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_53',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_54',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_57',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_58',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_59',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_60',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_61',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_62',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_63',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_64',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_65',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_66',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_67',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_68',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_69',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_70',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_71',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_72',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_73',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_74',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_75',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_76',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_77',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_78',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_79',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_80',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_81',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_82',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_83',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_84',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_85',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_86',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_87',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_88',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_89',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_90',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_91',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_92',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_93',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_94',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_95',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_96',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_97',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_98',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_99',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_100',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_101',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_102',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_103',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_106',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_107',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_108',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_109',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.10.0/search/all_2.js b/doc/v1.10.0/search/all_2.js new file mode 100644 index 000000000..6f594310c --- /dev/null +++ b/doc/v1.10.0/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_5',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_6',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_8',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_9',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_3.js b/doc/v1.10.0/search/all_3.js new file mode 100644 index 000000000..61125c0c2 --- /dev/null +++ b/doc/v1.10.0/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.10.0/search/all_4.js b/doc/v1.10.0/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/doc/v1.10.0/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_5.js b/doc/v1.10.0/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/doc/v1.10.0/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_6.js b/doc/v1.10.0/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/doc/v1.10.0/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/doc/v1.10.0/search/all_7.js b/doc/v1.10.0/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.10.0/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_8.js b/doc/v1.10.0/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/doc/v1.10.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.10.0/search/all_9.js b/doc/v1.10.0/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.10.0/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_a.js b/doc/v1.10.0/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/doc/v1.10.0/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_b.js b/doc/v1.10.0/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/doc/v1.10.0/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_c.js b/doc/v1.10.0/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.10.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_d.js b/doc/v1.10.0/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/doc/v1.10.0/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_e.js b/doc/v1.10.0/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.10.0/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.10.0/search/all_f.js b/doc/v1.10.0/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.10.0/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.10.0/search/classes_0.js b/doc/v1.10.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.10.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/close.svg b/doc/v1.10.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.10.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.10.0/search/defines_0.js b/doc/v1.10.0/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/doc/v1.10.0/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.10.0/search/enums_0.js b/doc/v1.10.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.10.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.10.0/search/enumvalues_0.js b/doc/v1.10.0/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/doc/v1.10.0/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.10.0/search/files_0.js b/doc/v1.10.0/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.10.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/functions_0.js b/doc/v1.10.0/search/functions_0.js new file mode 100644 index 000000000..f761fe699 --- /dev/null +++ b/doc/v1.10.0/search/functions_0.js @@ -0,0 +1,80 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fis_5fsupported_2',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_3',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_4',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_5',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_12',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_13',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_14',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_15',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_16',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_17',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_18',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_19',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_20',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_23',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_25',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_26',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_27',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_29',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_30',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_31',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_32',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_42',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_43',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_45',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_46',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_47',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_48',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_49',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_50',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_51',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_52',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_53',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_54',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_55',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_56',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_57',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_58',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_59',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_60',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_61',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_62',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_63',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_64',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_65',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_66',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_67',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_68',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_69',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_70',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_71',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_72',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_73',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_74',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_75',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_76',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.10.0/search/groups_0.js b/doc/v1.10.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.10.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/groups_1.js b/doc/v1.10.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.10.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/groups_2.js b/doc/v1.10.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.10.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.10.0/search/mag.svg b/doc/v1.10.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.10.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.10.0/search/mag_d.svg b/doc/v1.10.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.10.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.10.0/search/mag_sel.svg b/doc/v1.10.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.10.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.10.0/search/mag_seld.svg b/doc/v1.10.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.10.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.10.0/search/pages_0.js b/doc/v1.10.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.10.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/pages_1.js b/doc/v1.10.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.10.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/pages_2.js b/doc/v1.10.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.10.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/pages_3.js b/doc/v1.10.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.10.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.0/search/search.css b/doc/v1.10.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.10.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.10.0/search/search.js b/doc/v1.10.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.10.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.10.0/structxcm__addr__ip.html b/doc/v1.10.0/structxcm__addr__ip.html new file mode 100644 index 000000000..b2ddb4690 --- /dev/null +++ b/doc/v1.10.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.10.0/sync_off.png b/doc/v1.10.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.10.0/sync_off.png differ diff --git a/doc/v1.10.0/sync_on.png b/doc/v1.10.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.10.0/sync_on.png differ diff --git a/doc/v1.10.0/tab_a.png b/doc/v1.10.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.10.0/tab_a.png differ diff --git a/doc/v1.10.0/tab_ad.png b/doc/v1.10.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.10.0/tab_ad.png differ diff --git a/doc/v1.10.0/tab_b.png b/doc/v1.10.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.10.0/tab_b.png differ diff --git a/doc/v1.10.0/tab_bd.png b/doc/v1.10.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.10.0/tab_bd.png differ diff --git a/doc/v1.10.0/tab_h.png b/doc/v1.10.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.10.0/tab_h.png differ diff --git a/doc/v1.10.0/tab_hd.png b/doc/v1.10.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.10.0/tab_hd.png differ diff --git a/doc/v1.10.0/tab_s.png b/doc/v1.10.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.10.0/tab_s.png differ diff --git a/doc/v1.10.0/tab_sd.png b/doc/v1.10.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.10.0/tab_sd.png differ diff --git a/doc/v1.10.0/tabs.css b/doc/v1.10.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.10.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.10.0/topics.html b/doc/v1.10.0/topics.html new file mode 100644 index 000000000..2abe0cb31 --- /dev/null +++ b/doc/v1.10.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.10.0/xcm_8h.html b/doc/v1.10.0/xcm_8h.html new file mode 100644 index 000000000..1d36dbca9 --- /dev/null +++ b/doc/v1.10.0/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), an xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close an XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Always returns 0.
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to an XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves an XCM socket's file descriptor, for an XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/xcm_8h_source.html b/doc/v1.10.0/xcm_8h_source.html new file mode 100644 index 000000000..9b50a881a --- /dev/null +++ b/doc/v1.10.0/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1450#include <errno.h>
    +
    1451#include <stdbool.h>
    +
    1452#include <stddef.h>
    +
    1453#include <sys/types.h>
    +
    1454#include <xcm_attr_map.h>
    +
    1455
    +
    1457#define XCM_NONBLOCK (1<<0)
    +
    1458
    +
    1465struct xcm_socket;
    +
    1466
    +
    1519struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520
    +
    1542struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543 const struct xcm_attr_map *attrs);
    +
    1544
    +
    1580struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581
    +
    1597struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598 const struct xcm_attr_map *attrs);
    +
    1599
    +
    1615int xcm_close(struct xcm_socket *socket);
    +
    1616
    +
    1636void xcm_cleanup(struct xcm_socket *socket);
    +
    1637
    +
    1656struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1657
    +
    1677struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1678 const struct xcm_attr_map *attrs);
    +
    1679
    +
    1702int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1703 const void *__restrict buf, size_t len);
    +
    1704
    +
    1728int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1729 void *__restrict buf, size_t capacity);
    +
    1730
    +
    1733#define XCM_SO_RECEIVABLE (1<<0)
    +
    1736#define XCM_SO_SENDABLE (1<<1)
    +
    1738#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1739
    +
    1800int xcm_await(struct xcm_socket *socket, int condition);
    +
    1801
    +
    1849int xcm_fd(struct xcm_socket *socket);
    +
    1850
    +
    1896int xcm_finish(struct xcm_socket *socket);
    +
    1897
    +
    1938int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1939
    +
    1954bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1955
    +
    1972const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1973
    +
    1988const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1989
    +
    1990#include <xcm_compat.h>
    +
    1991
    +
    1992#ifdef __cplusplus
    +
    1993}
    +
    1994#endif
    +
    1995#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.10.0/xcm__addr_8h.html b/doc/v1.10.0/xcm__addr_8h.html new file mode 100644 index 000000000..0785e88a1 --- /dev/null +++ b/doc/v1.10.0/xcm__addr_8h.html @@ -0,0 +1,1267 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <stdbool.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    bool xcm_addr_is_valid (const char *xcm_addr_s)
     
    bool xcm_addr_is_supported (const char *xcm_addr_s)
     
    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_is_valid()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_valid (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is valid.

    +

    Checks if a string is a syntactically correct XCM address for a known (but not necessarily supported) XCM transport.

    +

    The correctness of the complete address is verified, including the transport-specific part (e.g., port number for TCP/IP-based transports).

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid, false if not.
    + +
    +
    + +

    ◆ xcm_addr_is_supported()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_supported (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is a valid and supported.

    +

    Checks if a string is a valid address for an XCM transport supported by this library instance.

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid and supported, false if not.
    + +
    +
    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of an XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/xcm__addr_8h_source.html b/doc/v1.10.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..c53320daf --- /dev/null +++ b/doc/v1.10.0/xcm__addr_8h_source.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <stdbool.h>
    +
    16#include <sys/socket.h>
    +
    17#include <sys/types.h>
    +
    18
    +
    26#define XCM_UTLS_PROTO "utls"
    +
    29#define XCM_TLS_PROTO "tls"
    +
    31#define XCM_TCP_PROTO "tcp"
    +
    33#define XCM_SCTP_PROTO "sctp"
    +
    36#define XCM_UX_PROTO "ux"
    +
    39#define XCM_UXF_PROTO "uxf"
    +
    40
    +
    43#define XCM_BTLS_PROTO "btls"
    +
    45#define XCM_BTCP_PROTO "btcp"
    +
    46
    +
    47enum xcm_addr_type {
    +
    48 xcm_addr_type_name,
    +
    49 xcm_addr_type_ip
    +
    50};
    +
    51
    +
    + +
    54{
    +
    56 sa_family_t family;
    +
    57
    +
    59 union {
    +
    62 in_addr_t ip4;
    +
    65 uint8_t ip6[16];
    + +
    67};
    +
    +
    68
    +
    + +
    71{
    +
    73 enum xcm_addr_type type;
    +
    74
    +
    76 union {
    +
    77 struct xcm_addr_ip ip;
    +
    78 /* Max DNS name length is 253 characters */
    +
    79 char name[254];
    +
    80 };
    +
    81};
    +
    +
    82
    +
    96bool xcm_addr_is_valid(const char *xcm_addr_s);
    +
    97
    +
    107bool xcm_addr_is_supported(const char *xcm_addr_s);
    +
    108
    +
    122int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    123
    +
    137int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    138 uint16_t *port);
    +
    139
    +
    153int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    170int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    171 uint16_t *port);
    +
    172
    +
    187int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    188 uint16_t *port);
    +
    189
    +
    203int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    204
    +
    218int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    219 size_t capacity);
    +
    220
    +
    234int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    235 uint16_t *port);
    +
    236
    +
    250int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    251 uint16_t *port);
    +
    252
    +
    268int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    269 char *utls_addr_s, size_t capacity);
    +
    270
    +
    286int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    287 char *tls_addr_s, size_t capacity);
    +
    288
    +
    304int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    305 char *tcp_addr_s, size_t capacity);
    +
    306
    +
    322int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    323 char *sctp_addr_s, size_t capacity);
    +
    324
    +
    339int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    340
    +
    355int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    356
    +
    372int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    373 char *btcp_addr_s, size_t capacity);
    +
    374
    +
    390int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    391 char *btls_addr_s, size_t capacity);
    +
    392
    +
    393#include <xcm_addr_compat.h>
    +
    394
    +
    395#ifdef __cplusplus
    +
    396}
    +
    397#endif
    +
    398#endif
    +
    Definition xcm_addr.h:71
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:73
    +
    Definition xcm_addr.h:54
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:56
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:65
    +
    in_addr_t ip4
    Definition xcm_addr.h:62
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    bool xcm_addr_is_supported(const char *xcm_addr_s)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    bool xcm_addr_is_valid(const char *xcm_addr_s)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.10.0/xcm__attr_8h.html b/doc/v1.10.0/xcm__attr_8h.html new file mode 100644 index 000000000..4e8e58876 --- /dev/null +++ b/doc/v1.10.0/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/xcm__attr_8h_source.html b/doc/v1.10.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..5c64a468d --- /dev/null +++ b/doc/v1.10.0/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.10.0/xcm__attr__map_8h.html b/doc/v1.10.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..538ad7a23 --- /dev/null +++ b/doc/v1.10.0/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/xcm__attr__map_8h_source.html b/doc/v1.10.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..093146990 --- /dev/null +++ b/doc/v1.10.0/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.10.0/xcm__attr__types_8h.html b/doc/v1.10.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..87ed45420 --- /dev/null +++ b/doc/v1.10.0/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/xcm__attr__types_8h_source.html b/doc/v1.10.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..aa00da053 --- /dev/null +++ b/doc/v1.10.0/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.10.0/xcm__compat_8h.html b/doc/v1.10.0/xcm__compat_8h.html new file mode 100644 index 000000000..f0d74b382 --- /dev/null +++ b/doc/v1.10.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/xcm__compat_8h_source.html b/doc/v1.10.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..3bc84c3e5 --- /dev/null +++ b/doc/v1.10.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.10.0/xcm__version_8h.html b/doc/v1.10.0/xcm__version_8h.html new file mode 100644 index 000000000..db5efe756 --- /dev/null +++ b/doc/v1.10.0/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   10
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.10.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   25
     
    #define XCM_VERSION_API   "0.25"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.10.0/xcm__version_8h_source.html b/doc/v1.10.0/xcm__version_8h_source.html new file mode 100644 index 000000000..bae48024f --- /dev/null +++ b/doc/v1.10.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 10
    +
    29
    +
    31#define XCM_VERSION_PATCH 0
    +
    32
    +
    34#define XCM_VERSION "1.10.0"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 25
    +
    48
    +
    50#define XCM_VERSION_API "0.25"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.10.1/annotated.html b/doc/v1.10.1/annotated.html new file mode 100644 index 000000000..ed5b9fef2 --- /dev/null +++ b/doc/v1.10.1/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.10.1/bc_s.png b/doc/v1.10.1/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.10.1/bc_s.png differ diff --git a/doc/v1.10.1/bc_sd.png b/doc/v1.10.1/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.10.1/bc_sd.png differ diff --git a/doc/v1.10.1/classes.html b/doc/v1.10.1/classes.html new file mode 100644 index 000000000..2e47f55a3 --- /dev/null +++ b/doc/v1.10.1/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.10.1/closed.png b/doc/v1.10.1/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.10.1/closed.png differ diff --git a/doc/v1.10.1/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.10.1/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..74d4bc00c --- /dev/null +++ b/doc/v1.10.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.10.1/doc.svg b/doc/v1.10.1/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.10.1/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.10.1/docd.svg b/doc/v1.10.1/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.10.1/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.10.1/doxygen.css b/doc/v1.10.1/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.10.1/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.10.1/doxygen.svg b/doc/v1.10.1/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.10.1/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.10.1/dynsections.js b/doc/v1.10.1/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.10.1/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.10.1/files.html b/doc/v1.10.1/files.html new file mode 100644 index 000000000..01f732fed --- /dev/null +++ b/doc/v1.10.1/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.10.1/folderclosed.svg b/doc/v1.10.1/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.10.1/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.10.1/folderclosedd.svg b/doc/v1.10.1/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.10.1/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.10.1/folderopen.svg b/doc/v1.10.1/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.10.1/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.10.1/folderopend.svg b/doc/v1.10.1/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.10.1/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.10.1/functions.html b/doc/v1.10.1/functions.html new file mode 100644 index 000000000..ebf2bb069 --- /dev/null +++ b/doc/v1.10.1/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.10.1/functions_vars.html b/doc/v1.10.1/functions_vars.html new file mode 100644 index 000000000..3701f0659 --- /dev/null +++ b/doc/v1.10.1/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.10.1/globals.html b/doc/v1.10.1/globals.html new file mode 100644 index 000000000..fac538fd4 --- /dev/null +++ b/doc/v1.10.1/globals.html @@ -0,0 +1,189 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.10.1/globals_defs.html b/doc/v1.10.1/globals_defs.html new file mode 100644 index 000000000..18c629904 --- /dev/null +++ b/doc/v1.10.1/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.10.1/globals_enum.html b/doc/v1.10.1/globals_enum.html new file mode 100644 index 000000000..b0f9745d9 --- /dev/null +++ b/doc/v1.10.1/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.10.1/globals_eval.html b/doc/v1.10.1/globals_eval.html new file mode 100644 index 000000000..42ce126de --- /dev/null +++ b/doc/v1.10.1/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.10.1/globals_func.html b/doc/v1.10.1/globals_func.html new file mode 100644 index 000000000..f1dd48757 --- /dev/null +++ b/doc/v1.10.1/globals_func.html @@ -0,0 +1,159 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.10.1/globals_type.html b/doc/v1.10.1/globals_type.html new file mode 100644 index 000000000..fff1a5c5f --- /dev/null +++ b/doc/v1.10.1/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.10.1/group__api__version.html b/doc/v1.10.1/group__api__version.html new file mode 100644 index 000000000..f812b36fc --- /dev/null +++ b/doc/v1.10.1/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   25
     
    #define XCM_VERSION_API   "0.25"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   25
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.25"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/group__lib__version.html b/doc/v1.10.1/group__lib__version.html new file mode 100644 index 000000000..56be51d08 --- /dev/null +++ b/doc/v1.10.1/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   10
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.10.1"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   10
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   1
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.10.1"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/index.html b/doc/v1.10.1/index.html new file mode 100644 index 000000000..fc4a9a72e --- /dev/null +++ b/doc/v1.10.1/index.html @@ -0,0 +1,718 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.25 [API]
    +
    +1.10.1 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is a shared library implementing an inter-process communication service on Linux. It facilitates communication between processes on the same system, as well as over a network.

    +

    XCM internals are divided into the core library, and a number of pluggable transports, handling the actual data delivery. In combination with an URL-like addressing scheme, it allows applications to be transport agnostic, and an IPC mechanism suitable for one deployment can seamlessly be replaced with another, in another deployment. The API semantics are the same, regardless of underlying transport used.

    +

    An XCM transport either provides a messaging or a byte stream type service.

    +

    XCM supports UNIX domain sockets for efficient local-only communication, and TCP, TLS and SCTP for remote inter-process communication. The service XCM provides is of the connection-oriented, client-server type. It is not a message bus and does not implement the publish-subscribe or broadcast patterns.

    +

    This document primarily serves as an API specification, but also also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Sockets API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    An XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport and BTCP Transport transports provide a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing an XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP, BTCP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP, BTLS and BTCP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) allocates a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of an XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object remains the same across the life-time of the socket.

    +

    In the BSD Sockets API, the socket fd being readable means it's likely, but not guaranteed, that the application can successfully read data from the socket. Similarly, a fd marked writable by for example poll() signifies that the application is likely to be able to write data to the socket.

    +

    An application using non-blocking XCM sockets must always wait for the XCM socket fd to become readable (e.g., the XCM socket fd should always be in the readfds in the select() call), regardless of the target condition. Thus, even if the application is waiting for an opportunity to send a message on a XCM socket, or is not interested in performing any type of operation on the socket, it must wait for the XCM socket fd to become readable. Not being interested in performing any operation here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket.

    +

    An application must always include all of its XCM socket fds into readfds in the select() call. An application must not leave an XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or neither of xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are called when its fd is marked readable by select().

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    The inability to finish the requested operation without blocking the thread (i.e., putting the thread to sleep) is signaled in the typical UNIX manner, by returning an NULL or -1, (depending on the return type) and setting errno to EAGAIN. Unlike most other errno values, EAGAIN is a temporary conditional, and not a terminal error.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the an XCM server socket is in non-blocking mode at the time of an xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on an XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    An XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, TCP, and BTCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided they operate on different sockets. Calls pertaining to the same sockets are not MT safe.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" an XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing an XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of an xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), an xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of an XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    Due to a bug in OpenSSL, partial chains (i.e., where the trust anchor is a trusted non-root certificate) is not allowed when CRL checking is enabled. In OpenSSL terms, X509_V_FLAG_PARTIAL_CHAIN is disabled when X509_V_FLAG_CRL_CHECK_ALL is enabled. Future versions of XCM, built against newer versions of OpenSSL, may allow partial chains in combination with CRL checking.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/doc/v1.10.1/inline_umlgraph_pnghtml.pu b/doc/v1.10.1/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..3d9fdf388 --- /dev/null +++ b/doc/v1.10.1/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(101, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(5, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(6, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.10.1/jquery.js b/doc/v1.10.1/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.10.1/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.10.1/menu.js b/doc/v1.10.1/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.10.1/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.10.1/menudata.js b/doc/v1.10.1/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/doc/v1.10.1/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.10.1/minus.svg b/doc/v1.10.1/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.10.1/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.10.1/minusd.svg b/doc/v1.10.1/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.10.1/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.10.1/nav_f.png b/doc/v1.10.1/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.10.1/nav_f.png differ diff --git a/doc/v1.10.1/nav_fd.png b/doc/v1.10.1/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.10.1/nav_fd.png differ diff --git a/doc/v1.10.1/nav_g.png b/doc/v1.10.1/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.10.1/nav_g.png differ diff --git a/doc/v1.10.1/nav_h.png b/doc/v1.10.1/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.10.1/nav_h.png differ diff --git a/doc/v1.10.1/nav_hd.png b/doc/v1.10.1/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.10.1/nav_hd.png differ diff --git a/doc/v1.10.1/nb_connect_and_send.png b/doc/v1.10.1/nb_connect_and_send.png new file mode 100644 index 000000000..ec94eb015 Binary files /dev/null and b/doc/v1.10.1/nb_connect_and_send.png differ diff --git a/doc/v1.10.1/nb_connect_explicit.png b/doc/v1.10.1/nb_connect_explicit.png new file mode 100644 index 000000000..a5df8f3b6 Binary files /dev/null and b/doc/v1.10.1/nb_connect_explicit.png differ diff --git a/doc/v1.10.1/nb_delayed_connection_refused.png b/doc/v1.10.1/nb_delayed_connection_refused.png new file mode 100644 index 000000000..5c216bb18 Binary files /dev/null and b/doc/v1.10.1/nb_delayed_connection_refused.png differ diff --git a/doc/v1.10.1/nb_flush_buffers_before_close.png b/doc/v1.10.1/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.10.1/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.10.1/nb_immediate_connection_refused.png b/doc/v1.10.1/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.10.1/nb_immediate_connection_refused.png differ diff --git a/doc/v1.10.1/open.png b/doc/v1.10.1/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.10.1/open.png differ diff --git a/doc/v1.10.1/plus.svg b/doc/v1.10.1/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.10.1/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.10.1/plusd.svg b/doc/v1.10.1/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.10.1/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.10.1/search/all_0.js b/doc/v1.10.1/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.10.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_1.js b/doc/v1.10.1/search/all_1.js new file mode 100644 index 000000000..70206c175 --- /dev/null +++ b/doc/v1.10.1/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_14',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_15',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_17',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_18',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_19',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_20',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_21',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_10.js b/doc/v1.10.1/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/doc/v1.10.1/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_11.js b/doc/v1.10.1/search/all_11.js new file mode 100644 index 000000000..482e3e761 --- /dev/null +++ b/doc/v1.10.1/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_12.js b/doc/v1.10.1/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/doc/v1.10.1/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.10.1/search/all_13.js b/doc/v1.10.1/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.10.1/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_14.js b/doc/v1.10.1/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/doc/v1.10.1/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_15.js b/doc/v1.10.1/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.10.1/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_16.js b/doc/v1.10.1/search/all_16.js new file mode 100644 index 000000000..fe56ef137 --- /dev/null +++ b/doc/v1.10.1/search/all_16.js @@ -0,0 +1,113 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_34',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_35',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_36',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_37',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_38',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_39',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_40',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_41',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_42',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_43',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_44',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_45',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_46',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_47',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_48',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_49',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_50',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_51',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_52',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_53',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_54',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_55',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_56',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_57',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_58',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_59',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_60',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_61',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_62',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_63',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_64',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_65',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_66',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_67',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_68',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_69',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_70',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_71',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_72',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_73',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_74',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_75',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_76',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_77',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_78',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_79',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_80',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_81',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_82',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_83',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_84',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_85',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_86',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_87',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_88',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_89',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_90',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_91',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_92',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_93',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_94',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_95',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_96',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_97',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_98',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_99',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_100',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_101',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_102',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_103',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_104',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_105',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_106',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_107',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_108',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_109',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.10.1/search/all_2.js b/doc/v1.10.1/search/all_2.js new file mode 100644 index 000000000..6f594310c --- /dev/null +++ b/doc/v1.10.1/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_5',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_6',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_8',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_9',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_3.js b/doc/v1.10.1/search/all_3.js new file mode 100644 index 000000000..61125c0c2 --- /dev/null +++ b/doc/v1.10.1/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.10.1/search/all_4.js b/doc/v1.10.1/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/doc/v1.10.1/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_5.js b/doc/v1.10.1/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/doc/v1.10.1/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_6.js b/doc/v1.10.1/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/doc/v1.10.1/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/doc/v1.10.1/search/all_7.js b/doc/v1.10.1/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.10.1/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_8.js b/doc/v1.10.1/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/doc/v1.10.1/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.10.1/search/all_9.js b/doc/v1.10.1/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.10.1/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_a.js b/doc/v1.10.1/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/doc/v1.10.1/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_b.js b/doc/v1.10.1/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/doc/v1.10.1/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_c.js b/doc/v1.10.1/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.10.1/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_d.js b/doc/v1.10.1/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/doc/v1.10.1/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_e.js b/doc/v1.10.1/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.10.1/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.10.1/search/all_f.js b/doc/v1.10.1/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.10.1/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.10.1/search/classes_0.js b/doc/v1.10.1/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.10.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/close.svg b/doc/v1.10.1/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.10.1/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.10.1/search/defines_0.js b/doc/v1.10.1/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/doc/v1.10.1/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.10.1/search/enums_0.js b/doc/v1.10.1/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.10.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.10.1/search/enumvalues_0.js b/doc/v1.10.1/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/doc/v1.10.1/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.10.1/search/files_0.js b/doc/v1.10.1/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.10.1/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/functions_0.js b/doc/v1.10.1/search/functions_0.js new file mode 100644 index 000000000..f761fe699 --- /dev/null +++ b/doc/v1.10.1/search/functions_0.js @@ -0,0 +1,80 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fis_5fsupported_2',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_3',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_4',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_5',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_12',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_13',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_14',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_15',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_16',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_17',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_18',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_19',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_20',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_23',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_25',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_26',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_27',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_29',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_30',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_31',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_32',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_42',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_43',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_45',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_46',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_47',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_48',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_49',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_50',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_51',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_52',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_53',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_54',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_55',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_56',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_57',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_58',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_59',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_60',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_61',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_62',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_63',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_64',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_65',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_66',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_67',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_68',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_69',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_70',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_71',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_72',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_73',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_74',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_75',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_76',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.10.1/search/groups_0.js b/doc/v1.10.1/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.10.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/groups_1.js b/doc/v1.10.1/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.10.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/groups_2.js b/doc/v1.10.1/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.10.1/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.10.1/search/mag.svg b/doc/v1.10.1/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.10.1/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.10.1/search/mag_d.svg b/doc/v1.10.1/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.10.1/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.10.1/search/mag_sel.svg b/doc/v1.10.1/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.10.1/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.10.1/search/mag_seld.svg b/doc/v1.10.1/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.10.1/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.10.1/search/pages_0.js b/doc/v1.10.1/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.10.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/pages_1.js b/doc/v1.10.1/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.10.1/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/pages_2.js b/doc/v1.10.1/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.10.1/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/pages_3.js b/doc/v1.10.1/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.10.1/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.10.1/search/search.css b/doc/v1.10.1/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.10.1/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.10.1/search/search.js b/doc/v1.10.1/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.10.1/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.10.1/structxcm__addr__ip.html b/doc/v1.10.1/structxcm__addr__ip.html new file mode 100644 index 000000000..c5285fae5 --- /dev/null +++ b/doc/v1.10.1/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.10.1/sync_off.png b/doc/v1.10.1/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.10.1/sync_off.png differ diff --git a/doc/v1.10.1/sync_on.png b/doc/v1.10.1/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.10.1/sync_on.png differ diff --git a/doc/v1.10.1/tab_a.png b/doc/v1.10.1/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.10.1/tab_a.png differ diff --git a/doc/v1.10.1/tab_ad.png b/doc/v1.10.1/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.10.1/tab_ad.png differ diff --git a/doc/v1.10.1/tab_b.png b/doc/v1.10.1/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.10.1/tab_b.png differ diff --git a/doc/v1.10.1/tab_bd.png b/doc/v1.10.1/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.10.1/tab_bd.png differ diff --git a/doc/v1.10.1/tab_h.png b/doc/v1.10.1/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.10.1/tab_h.png differ diff --git a/doc/v1.10.1/tab_hd.png b/doc/v1.10.1/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.10.1/tab_hd.png differ diff --git a/doc/v1.10.1/tab_s.png b/doc/v1.10.1/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.10.1/tab_s.png differ diff --git a/doc/v1.10.1/tab_sd.png b/doc/v1.10.1/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.10.1/tab_sd.png differ diff --git a/doc/v1.10.1/tabs.css b/doc/v1.10.1/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.10.1/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.10.1/topics.html b/doc/v1.10.1/topics.html new file mode 100644 index 000000000..0ccda787c --- /dev/null +++ b/doc/v1.10.1/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.10.1/xcm_8h.html b/doc/v1.10.1/xcm_8h.html new file mode 100644 index 000000000..301c4a372 --- /dev/null +++ b/doc/v1.10.1/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), an xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close an XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Always returns 0.
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to an XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves an XCM socket's file descriptor, for an XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/xcm_8h_source.html b/doc/v1.10.1/xcm_8h_source.html new file mode 100644 index 000000000..5678b8617 --- /dev/null +++ b/doc/v1.10.1/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1450#include <errno.h>
    +
    1451#include <stdbool.h>
    +
    1452#include <stddef.h>
    +
    1453#include <sys/types.h>
    +
    1454#include <xcm_attr_map.h>
    +
    1455
    +
    1457#define XCM_NONBLOCK (1<<0)
    +
    1458
    +
    1465struct xcm_socket;
    +
    1466
    +
    1519struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520
    +
    1542struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543 const struct xcm_attr_map *attrs);
    +
    1544
    +
    1580struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581
    +
    1597struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598 const struct xcm_attr_map *attrs);
    +
    1599
    +
    1615int xcm_close(struct xcm_socket *socket);
    +
    1616
    +
    1636void xcm_cleanup(struct xcm_socket *socket);
    +
    1637
    +
    1656struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1657
    +
    1677struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1678 const struct xcm_attr_map *attrs);
    +
    1679
    +
    1702int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1703 const void *__restrict buf, size_t len);
    +
    1704
    +
    1728int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1729 void *__restrict buf, size_t capacity);
    +
    1730
    +
    1733#define XCM_SO_RECEIVABLE (1<<0)
    +
    1736#define XCM_SO_SENDABLE (1<<1)
    +
    1738#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1739
    +
    1800int xcm_await(struct xcm_socket *socket, int condition);
    +
    1801
    +
    1849int xcm_fd(struct xcm_socket *socket);
    +
    1850
    +
    1896int xcm_finish(struct xcm_socket *socket);
    +
    1897
    +
    1938int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1939
    +
    1954bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1955
    +
    1972const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1973
    +
    1988const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1989
    +
    1990#include <xcm_compat.h>
    +
    1991
    +
    1992#ifdef __cplusplus
    +
    1993}
    +
    1994#endif
    +
    1995#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.10.1/xcm__addr_8h.html b/doc/v1.10.1/xcm__addr_8h.html new file mode 100644 index 000000000..34cb654ab --- /dev/null +++ b/doc/v1.10.1/xcm__addr_8h.html @@ -0,0 +1,1267 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <stdbool.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    bool xcm_addr_is_valid (const char *xcm_addr_s)
     
    bool xcm_addr_is_supported (const char *xcm_addr_s)
     
    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_is_valid()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_valid (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is valid.

    +

    Checks if a string is a syntactically correct XCM address for a known (but not necessarily supported) XCM transport.

    +

    The correctness of the complete address is verified, including the transport-specific part (e.g., port number for TCP/IP-based transports).

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid, false if not.
    + +
    +
    + +

    ◆ xcm_addr_is_supported()

    + +
    +
    + + + + + + + + +
    bool xcm_addr_is_supported (const char * xcm_addr_s)
    +
    +

    Checks if an XCM address is a valid and supported.

    +

    Checks if a string is a valid address for an XCM transport supported by this library instance.

    +
    Parameters
    + + +
    [in]xcm_addr_sThe XCM address string.
    +
    +
    +
    Returns
    Returns true if valid and supported, false if not.
    + +
    +
    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of an XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/xcm__addr_8h_source.html b/doc/v1.10.1/xcm__addr_8h_source.html new file mode 100644 index 000000000..22b7639fd --- /dev/null +++ b/doc/v1.10.1/xcm__addr_8h_source.html @@ -0,0 +1,231 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <stdbool.h>
    +
    16#include <sys/socket.h>
    +
    17#include <sys/types.h>
    +
    18
    +
    26#define XCM_UTLS_PROTO "utls"
    +
    29#define XCM_TLS_PROTO "tls"
    +
    31#define XCM_TCP_PROTO "tcp"
    +
    33#define XCM_SCTP_PROTO "sctp"
    +
    36#define XCM_UX_PROTO "ux"
    +
    39#define XCM_UXF_PROTO "uxf"
    +
    40
    +
    43#define XCM_BTLS_PROTO "btls"
    +
    45#define XCM_BTCP_PROTO "btcp"
    +
    46
    +
    47enum xcm_addr_type {
    +
    48 xcm_addr_type_name,
    +
    49 xcm_addr_type_ip
    +
    50};
    +
    51
    +
    + +
    54{
    +
    56 sa_family_t family;
    +
    57
    +
    59 union {
    +
    62 in_addr_t ip4;
    +
    65 uint8_t ip6[16];
    + +
    67};
    +
    +
    68
    +
    + +
    71{
    +
    73 enum xcm_addr_type type;
    +
    74
    +
    76 union {
    +
    77 struct xcm_addr_ip ip;
    +
    78 /* Max DNS name length is 253 characters */
    +
    79 char name[254];
    +
    80 };
    +
    81};
    +
    +
    82
    +
    96bool xcm_addr_is_valid(const char *xcm_addr_s);
    +
    97
    +
    107bool xcm_addr_is_supported(const char *xcm_addr_s);
    +
    108
    +
    122int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    123
    +
    137int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    138 uint16_t *port);
    +
    139
    +
    153int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    170int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    171 uint16_t *port);
    +
    172
    +
    187int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    188 uint16_t *port);
    +
    189
    +
    203int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    204
    +
    218int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    219 size_t capacity);
    +
    220
    +
    234int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    235 uint16_t *port);
    +
    236
    +
    250int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    251 uint16_t *port);
    +
    252
    +
    268int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    269 char *utls_addr_s, size_t capacity);
    +
    270
    +
    286int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    287 char *tls_addr_s, size_t capacity);
    +
    288
    +
    304int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    305 char *tcp_addr_s, size_t capacity);
    +
    306
    +
    322int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    323 char *sctp_addr_s, size_t capacity);
    +
    324
    +
    339int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    340
    +
    355int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    356
    +
    372int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    373 char *btcp_addr_s, size_t capacity);
    +
    374
    +
    390int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    391 char *btls_addr_s, size_t capacity);
    +
    392
    +
    393#include <xcm_addr_compat.h>
    +
    394
    +
    395#ifdef __cplusplus
    +
    396}
    +
    397#endif
    +
    398#endif
    +
    Definition xcm_addr.h:71
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:73
    +
    Definition xcm_addr.h:54
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:56
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:65
    +
    in_addr_t ip4
    Definition xcm_addr.h:62
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    bool xcm_addr_is_supported(const char *xcm_addr_s)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    bool xcm_addr_is_valid(const char *xcm_addr_s)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.10.1/xcm__attr_8h.html b/doc/v1.10.1/xcm__attr_8h.html new file mode 100644 index 000000000..494f67771 --- /dev/null +++ b/doc/v1.10.1/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/xcm__attr_8h_source.html b/doc/v1.10.1/xcm__attr_8h_source.html new file mode 100644 index 000000000..60c0261e9 --- /dev/null +++ b/doc/v1.10.1/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.10.1/xcm__attr__map_8h.html b/doc/v1.10.1/xcm__attr__map_8h.html new file mode 100644 index 000000000..a1c725510 --- /dev/null +++ b/doc/v1.10.1/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/xcm__attr__map_8h_source.html b/doc/v1.10.1/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..df1bdb18d --- /dev/null +++ b/doc/v1.10.1/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.10.1/xcm__attr__types_8h.html b/doc/v1.10.1/xcm__attr__types_8h.html new file mode 100644 index 000000000..aabbf565e --- /dev/null +++ b/doc/v1.10.1/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/xcm__attr__types_8h_source.html b/doc/v1.10.1/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..d537377b1 --- /dev/null +++ b/doc/v1.10.1/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.10.1/xcm__compat_8h.html b/doc/v1.10.1/xcm__compat_8h.html new file mode 100644 index 000000000..74c4413a5 --- /dev/null +++ b/doc/v1.10.1/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/xcm__compat_8h_source.html b/doc/v1.10.1/xcm__compat_8h_source.html new file mode 100644 index 000000000..ff2d519d8 --- /dev/null +++ b/doc/v1.10.1/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.10.1/xcm__version_8h.html b/doc/v1.10.1/xcm__version_8h.html new file mode 100644 index 000000000..a7f5e67df --- /dev/null +++ b/doc/v1.10.1/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   10
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.10.1"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   25
     
    #define XCM_VERSION_API   "0.25"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.10.1/xcm__version_8h_source.html b/doc/v1.10.1/xcm__version_8h_source.html new file mode 100644 index 000000000..be5ff3ead --- /dev/null +++ b/doc/v1.10.1/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 10
    +
    29
    +
    31#define XCM_VERSION_PATCH 1
    +
    32
    +
    34#define XCM_VERSION "1.10.1"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 25
    +
    48
    +
    50#define XCM_VERSION_API "0.25"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.2.0/annotated.html b/doc/v1.2.0/annotated.html new file mode 100644 index 000000000..119ed4fe0 --- /dev/null +++ b/doc/v1.2.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.2.0/bc_s.png b/doc/v1.2.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.2.0/bc_s.png differ diff --git a/doc/v1.2.0/bc_sd.png b/doc/v1.2.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.2.0/bc_sd.png differ diff --git a/doc/v1.2.0/classes.html b/doc/v1.2.0/classes.html new file mode 100644 index 000000000..f78e7579f --- /dev/null +++ b/doc/v1.2.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.2.0/closed.png b/doc/v1.2.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.2.0/closed.png differ diff --git a/doc/v1.2.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.2.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..62ddca7df --- /dev/null +++ b/doc/v1.2.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.2.0/doc.svg b/doc/v1.2.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.2.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.2.0/docd.svg b/doc/v1.2.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.2.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.2.0/doxygen.css b/doc/v1.2.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.2.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.2.0/doxygen.svg b/doc/v1.2.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.2.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.2.0/dynsections.js b/doc/v1.2.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.2.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.2.0/files.html b/doc/v1.2.0/files.html new file mode 100644 index 000000000..91d47d6ac --- /dev/null +++ b/doc/v1.2.0/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.2.0/folderclosed.svg b/doc/v1.2.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.2.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.2.0/folderclosedd.svg b/doc/v1.2.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.2.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.2.0/folderopen.svg b/doc/v1.2.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.2.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.2.0/folderopend.svg b/doc/v1.2.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.2.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.2.0/functions.html b/doc/v1.2.0/functions.html new file mode 100644 index 000000000..4f1ebbe5d --- /dev/null +++ b/doc/v1.2.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.2.0/functions_vars.html b/doc/v1.2.0/functions_vars.html new file mode 100644 index 000000000..8bf988a8f --- /dev/null +++ b/doc/v1.2.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.2.0/globals.html b/doc/v1.2.0/globals.html new file mode 100644 index 000000000..e37a4e725 --- /dev/null +++ b/doc/v1.2.0/globals.html @@ -0,0 +1,158 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.2.0/globals_defs.html b/doc/v1.2.0/globals_defs.html new file mode 100644 index 000000000..a5db9a0dd --- /dev/null +++ b/doc/v1.2.0/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.2.0/globals_enum.html b/doc/v1.2.0/globals_enum.html new file mode 100644 index 000000000..d78a7afb2 --- /dev/null +++ b/doc/v1.2.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.2.0/globals_eval.html b/doc/v1.2.0/globals_eval.html new file mode 100644 index 000000000..1a2af8d9b --- /dev/null +++ b/doc/v1.2.0/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.2.0/globals_func.html b/doc/v1.2.0/globals_func.html new file mode 100644 index 000000000..15c3ee397 --- /dev/null +++ b/doc/v1.2.0/globals_func.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.2.0/globals_type.html b/doc/v1.2.0/globals_type.html new file mode 100644 index 000000000..fbbdaae15 --- /dev/null +++ b/doc/v1.2.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.2.0/group__api__version.html b/doc/v1.2.0/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.2.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/group__lib__version.html b/doc/v1.2.0/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.2.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/index.html b/doc/v1.2.0/index.html new file mode 100644 index 000000000..306662aee --- /dev/null +++ b/doc/v1.2.0/index.html @@ -0,0 +1,525 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.16 [API]
    +
    +1.2.0 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishement has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at the next XCM call; would it be xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    An example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses TLS to provide a secure, private, two-way authenticated transport.

    +

    TLS is a byte-stream service, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6.

    +

    The TLS transport disables the Nagle algorithm of TCP.

    +

    +TLS Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key, from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +TLS Socket Attributes

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, including the UX transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/doc/v1.2.0/inline_umlgraph_pnghtml.pu b/doc/v1.2.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/doc/v1.2.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.2.0/jquery.js b/doc/v1.2.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.2.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.2.0/menu.js b/doc/v1.2.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.2.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.2.0/menudata.js b/doc/v1.2.0/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.2.0/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.2.0/minus.svg b/doc/v1.2.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.2.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.2.0/minusd.svg b/doc/v1.2.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.2.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.2.0/nav_f.png b/doc/v1.2.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.2.0/nav_f.png differ diff --git a/doc/v1.2.0/nav_fd.png b/doc/v1.2.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.2.0/nav_fd.png differ diff --git a/doc/v1.2.0/nav_g.png b/doc/v1.2.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.2.0/nav_g.png differ diff --git a/doc/v1.2.0/nav_h.png b/doc/v1.2.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.2.0/nav_h.png differ diff --git a/doc/v1.2.0/nav_hd.png b/doc/v1.2.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.2.0/nav_hd.png differ diff --git a/doc/v1.2.0/nb_connect_and_send.png b/doc/v1.2.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.2.0/nb_connect_and_send.png differ diff --git a/doc/v1.2.0/nb_connect_explicit.png b/doc/v1.2.0/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/doc/v1.2.0/nb_connect_explicit.png differ diff --git a/doc/v1.2.0/nb_delayed_connection_refused.png b/doc/v1.2.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.2.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.2.0/nb_flush_buffers_before_close.png b/doc/v1.2.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.2.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.2.0/nb_immediate_connection_refused.png b/doc/v1.2.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.2.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.2.0/open.png b/doc/v1.2.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.2.0/open.png differ diff --git a/doc/v1.2.0/plus.svg b/doc/v1.2.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.2.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.2.0/plusd.svg b/doc/v1.2.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.2.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.2.0/search/all_0.js b/doc/v1.2.0/search/all_0.js new file mode 100644 index 000000000..4c74c64dd --- /dev/null +++ b/doc/v1.2.0/search/all_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]] +]; diff --git a/doc/v1.2.0/search/all_1.js b/doc/v1.2.0/search/all_1.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/doc/v1.2.0/search/all_1.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_10.js b/doc/v1.2.0/search/all_10.js new file mode 100644 index 000000000..e933da984 --- /dev/null +++ b/doc/v1.2.0/search/all_10.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_11.js b/doc/v1.2.0/search/all_11.js new file mode 100644 index 000000000..798b0968c --- /dev/null +++ b/doc/v1.2.0/search/all_11.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20certificate_20and_20key_20storage_4',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.2.0/search/all_12.js b/doc/v1.2.0/search/all_12.js new file mode 100644 index 000000000..fafb226cf --- /dev/null +++ b/doc/v1.2.0/search/all_12.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20transport_3',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_4',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_5',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_6',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_13.js b/doc/v1.2.0/search/all_13.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.2.0/search/all_13.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_14.js b/doc/v1.2.0/search/all_14.js new file mode 100644 index 000000000..f24694761 --- /dev/null +++ b/doc/v1.2.0/search/all_14.js @@ -0,0 +1,87 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_1',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_2',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_3',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_4',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_5',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_6',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_7',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_8',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_9',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_10',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_11',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_19',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_20',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_21',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_22',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_23',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_24',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_25',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_26',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_27',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_28',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_29',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_30',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_31',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_32',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_33',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_34',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_35',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_36',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_37',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_38',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_39',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_40',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_41',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_42',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_43',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_44',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_45',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_46',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_47',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_48',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_49',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_50',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_51',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_52',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_53',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_54',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_55',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_56',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_57',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_58',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_59',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_60',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_61',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_62',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_63',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_64',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_65',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_66',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_67',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_68',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_69',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_70',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_71',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_72',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_73',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_74',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_75',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_76',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_77',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_78',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_79',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_80',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_81',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_82',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_83',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.2.0/search/all_15.js b/doc/v1.2.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.2.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_16.js b/doc/v1.2.0/search/all_16.js new file mode 100644 index 000000000..d1220a7ba --- /dev/null +++ b/doc/v1.2.0/search/all_16.js @@ -0,0 +1,120 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fis_5fsupported_7',['xcm_addr_is_supported',['../xcm__addr_8h.html#a5b71d5f267c2fb347a40c26f8eeb0925',1,'xcm_addr.h']]], + ['xcm_5faddr_5fis_5fvalid_8',['xcm_addr_is_valid',['../xcm__addr_8h.html#ac1b83bb657752c6211028c064d24f9c5',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtcp_9',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_10',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_11',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_12',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_13',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_14',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_15',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_16',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_17',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_18',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_19',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_20',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_21',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_22',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_23',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_24',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_25',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_26',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_27',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_28',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_29',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_30',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_31',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_32',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_33',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5flist_5flen_34',['xcm_attr_get_list_len',['../xcm__attr_8h.html#a4874393871d4fc69ea2afbce3df0fdc1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_35',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_36',['xcm_attr_getf',['../xcm__attr_8h.html#a1314c089ab1ddc73375baa5b253339b6',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbin_37',['xcm_attr_getf_bin',['../xcm__attr_8h.html#a4e27a4d3baff282bb3b58705e989bcb1',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fbool_38',['xcm_attr_getf_bool',['../xcm__attr_8h.html#a876b571856f0cd276dc1285602dd935e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fdouble_39',['xcm_attr_getf_double',['../xcm__attr_8h.html#abfa1900960965fc6162ab2e0935dd7ef',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fint64_40',['xcm_attr_getf_int64',['../xcm__attr_8h.html#af80f650822a266f975c6b3c312c305fe',1,'xcm_attr.h']]], + ['xcm_5fattr_5fgetf_5fstr_41',['xcm_attr_getf_str',['../xcm__attr_8h.html#ac039e5ca0eea5ed65ba4b497ccf19063',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_42',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_43',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_44',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_45',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_46',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_47',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_48',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_49',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_50',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_51',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_52',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_53',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_54',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_55',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_56',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_57',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_58',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_59',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_60',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_61',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_62',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_63',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_64',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_65',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_66',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_67',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_68',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_69',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_70',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_71',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_72',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_73',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_74',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_75',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_76',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_77',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_78',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_79',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_80',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_81',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_82',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_83',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_84',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_85',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_86',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_87',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_88',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_89',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_90',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_91',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_92',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_93',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_94',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_95',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_96',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_97',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_98',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_99',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_100',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_101',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_102',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_103',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_104',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_105',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_106',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_107',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_108',['xcm_version',['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_109',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_110',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h'],['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_111',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_112',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_113',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_114',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_115',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_116',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.2.0/search/all_2.js b/doc/v1.2.0/search/all_2.js new file mode 100644 index 000000000..8b2b3c959 --- /dev/null +++ b/doc/v1.2.0/search/all_2.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['close_3',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['connect_20and_20send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_6',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_7',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_8',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_9',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_10',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_12',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_13',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_14',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_15',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_16',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_3.js b/doc/v1.2.0/search/all_3.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.2.0/search/all_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_4.js b/doc/v1.2.0/search/all_4.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.2.0/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_5.js b/doc/v1.2.0/search/all_5.js new file mode 100644 index 000000000..da16ba1ff --- /dev/null +++ b/doc/v1.2.0/search/all_5.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_3',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_5',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_6.js b/doc/v1.2.0/search/all_6.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/doc/v1.2.0/search/all_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_7.js b/doc/v1.2.0/search/all_7.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.2.0/search/all_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.2.0/search/all_8.js b/doc/v1.2.0/search/all_8.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/doc/v1.2.0/search/all_8.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_9.js b/doc/v1.2.0/search/all_9.js new file mode 100644 index 000000000..7926955a0 --- /dev/null +++ b/doc/v1.2.0/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['TLS Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_a.js b/doc/v1.2.0/search/all_a.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/doc/v1.2.0/search/all_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_b.js b/doc/v1.2.0/search/all_b.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/doc/v1.2.0/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_c.js b/doc/v1.2.0/search/all_c.js new file mode 100644 index 000000000..b09d90c32 --- /dev/null +++ b/doc/v1.2.0/search/all_c.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['namespace_0',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_4',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_5',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_7',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_d.js b/doc/v1.2.0/search/all_d.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/doc/v1.2.0/search/all_d.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_e.js b/doc/v1.2.0/search/all_e.js new file mode 100644 index 000000000..8213bfe74 --- /dev/null +++ b/doc/v1.2.0/search/all_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['processing_20and_20fork_2',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_3',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_4',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.2.0/search/all_f.js b/doc/v1.2.0/search/all_f.js new file mode 100644 index 000000000..f9f816770 --- /dev/null +++ b/doc/v1.2.0/search/all_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['runtime_20certificate_20file_20updates_4',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.2.0/search/classes_0.js b/doc/v1.2.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.2.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/close.svg b/doc/v1.2.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.2.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.2.0/search/defines_0.js b/doc/v1.2.0/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/doc/v1.2.0/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.2.0/search/enums_0.js b/doc/v1.2.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.2.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.2.0/search/enumvalues_0.js b/doc/v1.2.0/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.2.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.2.0/search/files_0.js b/doc/v1.2.0/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/doc/v1.2.0/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/functions_0.js b/doc/v1.2.0/search/functions_0.js new file mode 100644 index 000000000..347860ce1 --- /dev/null +++ b/doc/v1.2.0/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_17',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_18',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_19',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_20',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_21',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_22',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_23',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_24',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_25',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_26',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_27',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_28',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_29',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_30',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_31',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_32',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_33',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_34',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_35',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_36',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_37',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_38',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_39',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_40',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_41',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_42',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_43',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_44',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_45',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_46',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_47',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_48',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_49',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_50',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_51',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_52',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_53',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_54',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.2.0/search/groups_0.js b/doc/v1.2.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.2.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/groups_1.js b/doc/v1.2.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.2.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/groups_2.js b/doc/v1.2.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.2.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.2.0/search/mag.svg b/doc/v1.2.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.2.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.2.0/search/mag_d.svg b/doc/v1.2.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.2.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.2.0/search/mag_sel.svg b/doc/v1.2.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.2.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.2.0/search/mag_seld.svg b/doc/v1.2.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.2.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.2.0/search/pages_0.js b/doc/v1.2.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.2.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/pages_1.js b/doc/v1.2.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.2.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/pages_2.js b/doc/v1.2.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.2.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/pages_3.js b/doc/v1.2.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.2.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.2.0/search/search.css b/doc/v1.2.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.2.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.2.0/search/search.js b/doc/v1.2.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.2.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.2.0/structxcm__addr__ip.html b/doc/v1.2.0/structxcm__addr__ip.html new file mode 100644 index 000000000..f23533ad4 --- /dev/null +++ b/doc/v1.2.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.2.0/sync_off.png b/doc/v1.2.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.2.0/sync_off.png differ diff --git a/doc/v1.2.0/sync_on.png b/doc/v1.2.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.2.0/sync_on.png differ diff --git a/doc/v1.2.0/tab_a.png b/doc/v1.2.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.2.0/tab_a.png differ diff --git a/doc/v1.2.0/tab_ad.png b/doc/v1.2.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.2.0/tab_ad.png differ diff --git a/doc/v1.2.0/tab_b.png b/doc/v1.2.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.2.0/tab_b.png differ diff --git a/doc/v1.2.0/tab_bd.png b/doc/v1.2.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.2.0/tab_bd.png differ diff --git a/doc/v1.2.0/tab_h.png b/doc/v1.2.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.2.0/tab_h.png differ diff --git a/doc/v1.2.0/tab_hd.png b/doc/v1.2.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.2.0/tab_hd.png differ diff --git a/doc/v1.2.0/tab_s.png b/doc/v1.2.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.2.0/tab_s.png differ diff --git a/doc/v1.2.0/tab_sd.png b/doc/v1.2.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.2.0/tab_sd.png differ diff --git a/doc/v1.2.0/tabs.css b/doc/v1.2.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.2.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.2.0/topics.html b/doc/v1.2.0/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.2.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.2.0/xcm_8h.html b/doc/v1.2.0/xcm_8h.html new file mode 100644 index 000000000..6d825a90b --- /dev/null +++ b/doc/v1.2.0/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/xcm_8h_source.html b/doc/v1.2.0/xcm_8h_source.html new file mode 100644 index 000000000..774a66257 --- /dev/null +++ b/doc/v1.2.0/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1008#include <errno.h>
    +
    1009#include <stdbool.h>
    +
    1010#include <sys/types.h>
    +
    1011
    +
    1012#include <xcm_attr_map.h>
    +
    1013
    +
    1015#define XCM_NONBLOCK (1<<0)
    +
    1016
    +
    1023struct xcm_socket;
    +
    1024
    +
    1075struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1076
    +
    1098struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1099 const struct xcm_attr_map *attrs);
    +
    1100
    +
    1131struct xcm_socket *xcm_server(const char *local_addr);
    +
    1132
    +
    1148struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1149 const struct xcm_attr_map *attrs);
    +
    1150
    +
    1167int xcm_close(struct xcm_socket *socket);
    +
    1168
    +
    1188void xcm_cleanup(struct xcm_socket *socket);
    +
    1189
    +
    1212struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1213
    +
    1230struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1231 const struct xcm_attr_map *attrs);
    +
    1232
    +
    1254int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1255
    +
    1278int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1279
    +
    1282#define XCM_SO_RECEIVABLE (1<<0)
    +
    1285#define XCM_SO_SENDABLE (1<<1)
    +
    1287#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1288
    +
    1349int xcm_await(struct xcm_socket *socket, int condition);
    +
    1350
    +
    1392int xcm_fd(struct xcm_socket *socket);
    +
    1393
    +
    1434int xcm_finish(struct xcm_socket *socket);
    +
    1435
    +
    1476int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1477
    +
    1492bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1493
    +
    1510const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1511
    +
    1526const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1527
    +
    1528#include <xcm_compat.h>
    +
    1529
    +
    1530#ifdef __cplusplus
    +
    1531}
    +
    1532#endif
    +
    1533#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.2.0/xcm__addr_8h.html b/doc/v1.2.0/xcm__addr_8h.html new file mode 100644 index 000000000..7c8a18daf --- /dev/null +++ b/doc/v1.2.0/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/xcm__addr_8h_source.html b/doc/v1.2.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..614839899 --- /dev/null +++ b/doc/v1.2.0/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.2.0/xcm__attr_8h.html b/doc/v1.2.0/xcm__attr_8h.html new file mode 100644 index 000000000..509da300a --- /dev/null +++ b/doc/v1.2.0/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/xcm__attr_8h_source.html b/doc/v1.2.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..a4727f00a --- /dev/null +++ b/doc/v1.2.0/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.2.0/xcm__attr__map_8h.html b/doc/v1.2.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..b42457198 --- /dev/null +++ b/doc/v1.2.0/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/xcm__attr__map_8h_source.html b/doc/v1.2.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..0e6cea488 --- /dev/null +++ b/doc/v1.2.0/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.2.0/xcm__attr__types_8h.html b/doc/v1.2.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..34faf7fc2 --- /dev/null +++ b/doc/v1.2.0/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/xcm__attr__types_8h_source.html b/doc/v1.2.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..82696265b --- /dev/null +++ b/doc/v1.2.0/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.2.0/xcm__compat_8h.html b/doc/v1.2.0/xcm__compat_8h.html new file mode 100644 index 000000000..58f1a7077 --- /dev/null +++ b/doc/v1.2.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/xcm__compat_8h_source.html b/doc/v1.2.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..29b3c99d9 --- /dev/null +++ b/doc/v1.2.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.2.0/xcm__version_8h.html b/doc/v1.2.0/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.2.0/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.2.0/xcm__version_8h_source.html b/doc/v1.2.0/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.2.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.3.0/annotated.html b/doc/v1.3.0/annotated.html new file mode 100644 index 000000000..c478190f6 --- /dev/null +++ b/doc/v1.3.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.3.0/bc_s.png b/doc/v1.3.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.3.0/bc_s.png differ diff --git a/doc/v1.3.0/bc_sd.png b/doc/v1.3.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.3.0/bc_sd.png differ diff --git a/doc/v1.3.0/classes.html b/doc/v1.3.0/classes.html new file mode 100644 index 000000000..04aa87c28 --- /dev/null +++ b/doc/v1.3.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.3.0/closed.png b/doc/v1.3.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.3.0/closed.png differ diff --git a/doc/v1.3.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.3.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..212b6b05a --- /dev/null +++ b/doc/v1.3.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.3.0/doc.svg b/doc/v1.3.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.3.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.0/docd.svg b/doc/v1.3.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.3.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.0/doxygen.css b/doc/v1.3.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.3.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.3.0/doxygen.svg b/doc/v1.3.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.3.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.3.0/dynsections.js b/doc/v1.3.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.3.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.3.0/files.html b/doc/v1.3.0/files.html new file mode 100644 index 000000000..b28030171 --- /dev/null +++ b/doc/v1.3.0/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.3.0/folderclosed.svg b/doc/v1.3.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.3.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.3.0/folderclosedd.svg b/doc/v1.3.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.3.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.3.0/folderopen.svg b/doc/v1.3.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.3.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.3.0/folderopend.svg b/doc/v1.3.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.3.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.0/functions.html b/doc/v1.3.0/functions.html new file mode 100644 index 000000000..26f36a380 --- /dev/null +++ b/doc/v1.3.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.3.0/functions_vars.html b/doc/v1.3.0/functions_vars.html new file mode 100644 index 000000000..2884397c0 --- /dev/null +++ b/doc/v1.3.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.3.0/globals.html b/doc/v1.3.0/globals.html new file mode 100644 index 000000000..46d3265fe --- /dev/null +++ b/doc/v1.3.0/globals.html @@ -0,0 +1,158 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.3.0/globals_defs.html b/doc/v1.3.0/globals_defs.html new file mode 100644 index 000000000..4f2e0788d --- /dev/null +++ b/doc/v1.3.0/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.0/globals_enum.html b/doc/v1.3.0/globals_enum.html new file mode 100644 index 000000000..fd9b9ac74 --- /dev/null +++ b/doc/v1.3.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.0/globals_eval.html b/doc/v1.3.0/globals_eval.html new file mode 100644 index 000000000..5a1465eec --- /dev/null +++ b/doc/v1.3.0/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.0/globals_func.html b/doc/v1.3.0/globals_func.html new file mode 100644 index 000000000..9ca5e815f --- /dev/null +++ b/doc/v1.3.0/globals_func.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.3.0/globals_type.html b/doc/v1.3.0/globals_type.html new file mode 100644 index 000000000..262237ff8 --- /dev/null +++ b/doc/v1.3.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.0/group__api__version.html b/doc/v1.3.0/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.3.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/group__lib__version.html b/doc/v1.3.0/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.3.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/index.html b/doc/v1.3.0/index.html new file mode 100644 index 000000000..bf3415cf8 --- /dev/null +++ b/doc/v1.3.0/index.html @@ -0,0 +1,560 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.17 [API]
    +
    +1.3.0 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    An example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often known as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/doc/v1.3.0/inline_umlgraph_pnghtml.pu b/doc/v1.3.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/doc/v1.3.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.3.0/jquery.js b/doc/v1.3.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.3.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.3.0/menu.js b/doc/v1.3.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.3.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.3.0/menudata.js b/doc/v1.3.0/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.3.0/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.3.0/minus.svg b/doc/v1.3.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.3.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.3.0/minusd.svg b/doc/v1.3.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.3.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.3.0/nav_f.png b/doc/v1.3.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.3.0/nav_f.png differ diff --git a/doc/v1.3.0/nav_fd.png b/doc/v1.3.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.3.0/nav_fd.png differ diff --git a/doc/v1.3.0/nav_g.png b/doc/v1.3.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.3.0/nav_g.png differ diff --git a/doc/v1.3.0/nav_h.png b/doc/v1.3.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.3.0/nav_h.png differ diff --git a/doc/v1.3.0/nav_hd.png b/doc/v1.3.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.3.0/nav_hd.png differ diff --git a/doc/v1.3.0/nb_connect_and_send.png b/doc/v1.3.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.3.0/nb_connect_and_send.png differ diff --git a/doc/v1.3.0/nb_connect_explicit.png b/doc/v1.3.0/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/doc/v1.3.0/nb_connect_explicit.png differ diff --git a/doc/v1.3.0/nb_delayed_connection_refused.png b/doc/v1.3.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.3.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.3.0/nb_flush_buffers_before_close.png b/doc/v1.3.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.3.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.3.0/nb_immediate_connection_refused.png b/doc/v1.3.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.3.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.3.0/open.png b/doc/v1.3.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.3.0/open.png differ diff --git a/doc/v1.3.0/plus.svg b/doc/v1.3.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.3.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.3.0/plusd.svg b/doc/v1.3.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.3.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.3.0/search/all_0.js b/doc/v1.3.0/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.3.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_1.js b/doc/v1.3.0/search/all_1.js new file mode 100644 index 000000000..ee46bfe7e --- /dev/null +++ b/doc/v1.3.0/search/all_1.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_14',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_10.js b/doc/v1.3.0/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.3.0/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_11.js b/doc/v1.3.0/search/all_11.js new file mode 100644 index 000000000..8993846a2 --- /dev/null +++ b/doc/v1.3.0/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_12.js b/doc/v1.3.0/search/all_12.js new file mode 100644 index 000000000..15d6200c6 --- /dev/null +++ b/doc/v1.3.0/search/all_12.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20socket_20attributes_4',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_5',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_6',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_7',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_8',['Transports',['../index.html#transports',1,'']]], + ['type_9',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.0/search/all_13.js b/doc/v1.3.0/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.3.0/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_14.js b/doc/v1.3.0/search/all_14.js new file mode 100644 index 000000000..d087c6b23 --- /dev/null +++ b/doc/v1.3.0/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_15.js b/doc/v1.3.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.3.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_16.js b/doc/v1.3.0/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/doc/v1.3.0/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.0/search/all_2.js b/doc/v1.3.0/search/all_2.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/doc/v1.3.0/search/all_2.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_3.js b/doc/v1.3.0/search/all_3.js new file mode 100644 index 000000000..927e04535 --- /dev/null +++ b/doc/v1.3.0/search/all_3.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['close_3',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_5',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_6',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_7',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_8',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_9',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_10',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_11',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_12',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_13',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_14',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_15',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_16',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_17',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_4.js b/doc/v1.3.0/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.3.0/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_5.js b/doc/v1.3.0/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.3.0/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_6.js b/doc/v1.3.0/search/all_6.js new file mode 100644 index 000000000..da16ba1ff --- /dev/null +++ b/doc/v1.3.0/search/all_6.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_3',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_5',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_7.js b/doc/v1.3.0/search/all_7.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/doc/v1.3.0/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_8.js b/doc/v1.3.0/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.3.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.3.0/search/all_9.js b/doc/v1.3.0/search/all_9.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/doc/v1.3.0/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_a.js b/doc/v1.3.0/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.3.0/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_b.js b/doc/v1.3.0/search/all_b.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/doc/v1.3.0/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_c.js b/doc/v1.3.0/search/all_c.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/doc/v1.3.0/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_d.js b/doc/v1.3.0/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.3.0/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_e.js b/doc/v1.3.0/search/all_e.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/doc/v1.3.0/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.3.0/search/all_f.js b/doc/v1.3.0/search/all_f.js new file mode 100644 index 000000000..8213bfe74 --- /dev/null +++ b/doc/v1.3.0/search/all_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['processing_20and_20fork_2',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_3',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_4',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.3.0/search/classes_0.js b/doc/v1.3.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.3.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/close.svg b/doc/v1.3.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.3.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.3.0/search/defines_0.js b/doc/v1.3.0/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/doc/v1.3.0/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.3.0/search/enums_0.js b/doc/v1.3.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.3.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.0/search/enumvalues_0.js b/doc/v1.3.0/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.3.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.0/search/files_0.js b/doc/v1.3.0/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/doc/v1.3.0/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/functions_0.js b/doc/v1.3.0/search/functions_0.js new file mode 100644 index 000000000..347860ce1 --- /dev/null +++ b/doc/v1.3.0/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_17',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_18',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_19',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_20',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_21',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_22',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_23',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_24',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_25',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_26',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_27',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_28',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_29',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_30',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_31',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_32',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_33',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_34',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_35',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_36',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_37',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_38',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_39',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_40',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_41',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_42',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_43',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_44',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_45',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_46',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_47',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_48',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_49',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_50',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_51',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_52',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_53',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_54',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.0/search/groups_0.js b/doc/v1.3.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.3.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/groups_1.js b/doc/v1.3.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.3.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/groups_2.js b/doc/v1.3.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.3.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.3.0/search/mag.svg b/doc/v1.3.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.3.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.3.0/search/mag_d.svg b/doc/v1.3.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.3.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.3.0/search/mag_sel.svg b/doc/v1.3.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.3.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.3.0/search/mag_seld.svg b/doc/v1.3.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.3.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.3.0/search/pages_0.js b/doc/v1.3.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.3.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/pages_1.js b/doc/v1.3.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.3.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/pages_2.js b/doc/v1.3.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.3.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/pages_3.js b/doc/v1.3.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.3.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.0/search/search.css b/doc/v1.3.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.3.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.3.0/search/search.js b/doc/v1.3.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.3.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.3.0/structxcm__addr__ip.html b/doc/v1.3.0/structxcm__addr__ip.html new file mode 100644 index 000000000..76a50c6b8 --- /dev/null +++ b/doc/v1.3.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.3.0/sync_off.png b/doc/v1.3.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.3.0/sync_off.png differ diff --git a/doc/v1.3.0/sync_on.png b/doc/v1.3.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.3.0/sync_on.png differ diff --git a/doc/v1.3.0/tab_a.png b/doc/v1.3.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.3.0/tab_a.png differ diff --git a/doc/v1.3.0/tab_ad.png b/doc/v1.3.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.3.0/tab_ad.png differ diff --git a/doc/v1.3.0/tab_b.png b/doc/v1.3.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.3.0/tab_b.png differ diff --git a/doc/v1.3.0/tab_bd.png b/doc/v1.3.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.3.0/tab_bd.png differ diff --git a/doc/v1.3.0/tab_h.png b/doc/v1.3.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.3.0/tab_h.png differ diff --git a/doc/v1.3.0/tab_hd.png b/doc/v1.3.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.3.0/tab_hd.png differ diff --git a/doc/v1.3.0/tab_s.png b/doc/v1.3.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.3.0/tab_s.png differ diff --git a/doc/v1.3.0/tab_sd.png b/doc/v1.3.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.3.0/tab_sd.png differ diff --git a/doc/v1.3.0/tabs.css b/doc/v1.3.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.3.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.3.0/topics.html b/doc/v1.3.0/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.3.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.3.0/xcm_8h.html b/doc/v1.3.0/xcm_8h.html new file mode 100644 index 000000000..5f604f54d --- /dev/null +++ b/doc/v1.3.0/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/xcm_8h_source.html b/doc/v1.3.0/xcm_8h_source.html new file mode 100644 index 000000000..dacaf38df --- /dev/null +++ b/doc/v1.3.0/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1099#include <errno.h>
    +
    1100#include <stdbool.h>
    +
    1101#include <sys/types.h>
    +
    1102
    +
    1103#include <xcm_attr_map.h>
    +
    1104
    +
    1106#define XCM_NONBLOCK (1<<0)
    +
    1107
    +
    1114struct xcm_socket;
    +
    1115
    +
    1166struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1167
    +
    1189struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1190 const struct xcm_attr_map *attrs);
    +
    1191
    +
    1222struct xcm_socket *xcm_server(const char *local_addr);
    +
    1223
    +
    1239struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1240 const struct xcm_attr_map *attrs);
    +
    1241
    +
    1258int xcm_close(struct xcm_socket *socket);
    +
    1259
    +
    1279void xcm_cleanup(struct xcm_socket *socket);
    +
    1280
    +
    1303struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1304
    +
    1321struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1322 const struct xcm_attr_map *attrs);
    +
    1323
    +
    1345int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1346
    +
    1369int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1370
    +
    1373#define XCM_SO_RECEIVABLE (1<<0)
    +
    1376#define XCM_SO_SENDABLE (1<<1)
    +
    1378#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1379
    +
    1440int xcm_await(struct xcm_socket *socket, int condition);
    +
    1441
    +
    1483int xcm_fd(struct xcm_socket *socket);
    +
    1484
    +
    1525int xcm_finish(struct xcm_socket *socket);
    +
    1526
    +
    1567int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1568
    +
    1583bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1584
    +
    1601const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1602
    +
    1617const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1618
    +
    1619#include <xcm_compat.h>
    +
    1620
    +
    1621#ifdef __cplusplus
    +
    1622}
    +
    1623#endif
    +
    1624#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.3.0/xcm__addr_8h.html b/doc/v1.3.0/xcm__addr_8h.html new file mode 100644 index 000000000..f85de1cf0 --- /dev/null +++ b/doc/v1.3.0/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/xcm__addr_8h_source.html b/doc/v1.3.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..6ca82382d --- /dev/null +++ b/doc/v1.3.0/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.3.0/xcm__attr_8h.html b/doc/v1.3.0/xcm__attr_8h.html new file mode 100644 index 000000000..6154e9dda --- /dev/null +++ b/doc/v1.3.0/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/xcm__attr_8h_source.html b/doc/v1.3.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..353256193 --- /dev/null +++ b/doc/v1.3.0/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.3.0/xcm__attr__map_8h.html b/doc/v1.3.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..8f77cfec5 --- /dev/null +++ b/doc/v1.3.0/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/xcm__attr__map_8h_source.html b/doc/v1.3.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..52fa729a3 --- /dev/null +++ b/doc/v1.3.0/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.3.0/xcm__attr__types_8h.html b/doc/v1.3.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..c8e9ffe34 --- /dev/null +++ b/doc/v1.3.0/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/xcm__attr__types_8h_source.html b/doc/v1.3.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..1d1d9e021 --- /dev/null +++ b/doc/v1.3.0/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.3.0/xcm__compat_8h.html b/doc/v1.3.0/xcm__compat_8h.html new file mode 100644 index 000000000..b7dd5f9fc --- /dev/null +++ b/doc/v1.3.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/xcm__compat_8h_source.html b/doc/v1.3.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..8a5ea2e74 --- /dev/null +++ b/doc/v1.3.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.3.0/xcm__version_8h.html b/doc/v1.3.0/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.3.0/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.0/xcm__version_8h_source.html b/doc/v1.3.0/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.3.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.3.1/annotated.html b/doc/v1.3.1/annotated.html new file mode 100644 index 000000000..49806440b --- /dev/null +++ b/doc/v1.3.1/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.3.1/bc_s.png b/doc/v1.3.1/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.3.1/bc_s.png differ diff --git a/doc/v1.3.1/bc_sd.png b/doc/v1.3.1/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.3.1/bc_sd.png differ diff --git a/doc/v1.3.1/classes.html b/doc/v1.3.1/classes.html new file mode 100644 index 000000000..5ea3d9939 --- /dev/null +++ b/doc/v1.3.1/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.3.1/closed.png b/doc/v1.3.1/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.3.1/closed.png differ diff --git a/doc/v1.3.1/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.3.1/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..fd9656c6c --- /dev/null +++ b/doc/v1.3.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.3.1/doc.svg b/doc/v1.3.1/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.3.1/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.1/docd.svg b/doc/v1.3.1/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.3.1/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.1/doxygen.css b/doc/v1.3.1/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.3.1/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.3.1/doxygen.svg b/doc/v1.3.1/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.3.1/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.3.1/dynsections.js b/doc/v1.3.1/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.3.1/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.3.1/files.html b/doc/v1.3.1/files.html new file mode 100644 index 000000000..1a235e3a9 --- /dev/null +++ b/doc/v1.3.1/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.3.1/folderclosed.svg b/doc/v1.3.1/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.3.1/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.3.1/folderclosedd.svg b/doc/v1.3.1/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.3.1/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.3.1/folderopen.svg b/doc/v1.3.1/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.3.1/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.3.1/folderopend.svg b/doc/v1.3.1/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.3.1/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.1/functions.html b/doc/v1.3.1/functions.html new file mode 100644 index 000000000..1fe92bb85 --- /dev/null +++ b/doc/v1.3.1/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.3.1/functions_vars.html b/doc/v1.3.1/functions_vars.html new file mode 100644 index 000000000..2bfaaa998 --- /dev/null +++ b/doc/v1.3.1/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.3.1/globals.html b/doc/v1.3.1/globals.html new file mode 100644 index 000000000..67776d55b --- /dev/null +++ b/doc/v1.3.1/globals.html @@ -0,0 +1,158 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.3.1/globals_defs.html b/doc/v1.3.1/globals_defs.html new file mode 100644 index 000000000..75a06e317 --- /dev/null +++ b/doc/v1.3.1/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.1/globals_enum.html b/doc/v1.3.1/globals_enum.html new file mode 100644 index 000000000..acc871120 --- /dev/null +++ b/doc/v1.3.1/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.1/globals_eval.html b/doc/v1.3.1/globals_eval.html new file mode 100644 index 000000000..5487d199b --- /dev/null +++ b/doc/v1.3.1/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.1/globals_func.html b/doc/v1.3.1/globals_func.html new file mode 100644 index 000000000..4c11cf580 --- /dev/null +++ b/doc/v1.3.1/globals_func.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.3.1/globals_type.html b/doc/v1.3.1/globals_type.html new file mode 100644 index 000000000..3b5c60f5f --- /dev/null +++ b/doc/v1.3.1/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.1/group__api__version.html b/doc/v1.3.1/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.3.1/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/group__lib__version.html b/doc/v1.3.1/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.3.1/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/index.html b/doc/v1.3.1/index.html new file mode 100644 index 000000000..b31905cb4 --- /dev/null +++ b/doc/v1.3.1/index.html @@ -0,0 +1,560 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.17 [API]
    +
    +1.3.1 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    An example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often known as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/doc/v1.3.1/inline_umlgraph_pnghtml.pu b/doc/v1.3.1/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..b85700638 --- /dev/null +++ b/doc/v1.3.1/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [...], [99, ...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.3.1/jquery.js b/doc/v1.3.1/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.3.1/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.3.1/menu.js b/doc/v1.3.1/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.3.1/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.3.1/menudata.js b/doc/v1.3.1/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.3.1/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.3.1/minus.svg b/doc/v1.3.1/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.3.1/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.3.1/minusd.svg b/doc/v1.3.1/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.3.1/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.3.1/nav_f.png b/doc/v1.3.1/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.3.1/nav_f.png differ diff --git a/doc/v1.3.1/nav_fd.png b/doc/v1.3.1/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.3.1/nav_fd.png differ diff --git a/doc/v1.3.1/nav_g.png b/doc/v1.3.1/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.3.1/nav_g.png differ diff --git a/doc/v1.3.1/nav_h.png b/doc/v1.3.1/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.3.1/nav_h.png differ diff --git a/doc/v1.3.1/nav_hd.png b/doc/v1.3.1/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.3.1/nav_hd.png differ diff --git a/doc/v1.3.1/nb_connect_and_send.png b/doc/v1.3.1/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.3.1/nb_connect_and_send.png differ diff --git a/doc/v1.3.1/nb_connect_explicit.png b/doc/v1.3.1/nb_connect_explicit.png new file mode 100644 index 000000000..34593118e Binary files /dev/null and b/doc/v1.3.1/nb_connect_explicit.png differ diff --git a/doc/v1.3.1/nb_delayed_connection_refused.png b/doc/v1.3.1/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.3.1/nb_delayed_connection_refused.png differ diff --git a/doc/v1.3.1/nb_flush_buffers_before_close.png b/doc/v1.3.1/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.3.1/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.3.1/nb_immediate_connection_refused.png b/doc/v1.3.1/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.3.1/nb_immediate_connection_refused.png differ diff --git a/doc/v1.3.1/open.png b/doc/v1.3.1/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.3.1/open.png differ diff --git a/doc/v1.3.1/plus.svg b/doc/v1.3.1/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.3.1/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.3.1/plusd.svg b/doc/v1.3.1/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.3.1/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.3.1/search/all_0.js b/doc/v1.3.1/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.3.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_1.js b/doc/v1.3.1/search/all_1.js new file mode 100644 index 000000000..ee46bfe7e --- /dev/null +++ b/doc/v1.3.1/search/all_1.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_14',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_10.js b/doc/v1.3.1/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.3.1/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_11.js b/doc/v1.3.1/search/all_11.js new file mode 100644 index 000000000..8993846a2 --- /dev/null +++ b/doc/v1.3.1/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_12.js b/doc/v1.3.1/search/all_12.js new file mode 100644 index 000000000..15d6200c6 --- /dev/null +++ b/doc/v1.3.1/search/all_12.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20socket_20attributes_4',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_5',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_6',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_7',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_8',['Transports',['../index.html#transports',1,'']]], + ['type_9',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.1/search/all_13.js b/doc/v1.3.1/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.3.1/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_14.js b/doc/v1.3.1/search/all_14.js new file mode 100644 index 000000000..d087c6b23 --- /dev/null +++ b/doc/v1.3.1/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_15.js b/doc/v1.3.1/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.3.1/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_16.js b/doc/v1.3.1/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/doc/v1.3.1/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.1/search/all_2.js b/doc/v1.3.1/search/all_2.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/doc/v1.3.1/search/all_2.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_3.js b/doc/v1.3.1/search/all_3.js new file mode 100644 index 000000000..927e04535 --- /dev/null +++ b/doc/v1.3.1/search/all_3.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['close_3',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_5',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_6',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_7',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_8',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_9',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_10',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_11',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_12',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_13',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_14',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_15',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_16',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_17',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_4.js b/doc/v1.3.1/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.3.1/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_5.js b/doc/v1.3.1/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.3.1/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_6.js b/doc/v1.3.1/search/all_6.js new file mode 100644 index 000000000..da16ba1ff --- /dev/null +++ b/doc/v1.3.1/search/all_6.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_3',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_5',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_7.js b/doc/v1.3.1/search/all_7.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/doc/v1.3.1/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_8.js b/doc/v1.3.1/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.3.1/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.3.1/search/all_9.js b/doc/v1.3.1/search/all_9.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/doc/v1.3.1/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_a.js b/doc/v1.3.1/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.3.1/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_b.js b/doc/v1.3.1/search/all_b.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/doc/v1.3.1/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_c.js b/doc/v1.3.1/search/all_c.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/doc/v1.3.1/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_d.js b/doc/v1.3.1/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.3.1/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_e.js b/doc/v1.3.1/search/all_e.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/doc/v1.3.1/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.3.1/search/all_f.js b/doc/v1.3.1/search/all_f.js new file mode 100644 index 000000000..8213bfe74 --- /dev/null +++ b/doc/v1.3.1/search/all_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['processing_20and_20fork_2',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_3',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_4',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.3.1/search/classes_0.js b/doc/v1.3.1/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.3.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/close.svg b/doc/v1.3.1/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.3.1/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.3.1/search/defines_0.js b/doc/v1.3.1/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/doc/v1.3.1/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.3.1/search/enums_0.js b/doc/v1.3.1/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.3.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.1/search/enumvalues_0.js b/doc/v1.3.1/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.3.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.1/search/files_0.js b/doc/v1.3.1/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/doc/v1.3.1/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/functions_0.js b/doc/v1.3.1/search/functions_0.js new file mode 100644 index 000000000..347860ce1 --- /dev/null +++ b/doc/v1.3.1/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_17',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_18',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_19',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_20',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_21',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_22',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_23',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_24',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_25',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_26',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_27',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_28',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_29',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_30',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_31',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_32',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_33',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_34',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_35',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_36',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_37',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_38',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_39',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_40',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_41',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_42',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_43',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_44',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_45',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_46',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_47',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_48',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_49',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_50',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_51',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_52',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_53',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_54',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.1/search/groups_0.js b/doc/v1.3.1/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.3.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/groups_1.js b/doc/v1.3.1/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.3.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/groups_2.js b/doc/v1.3.1/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.3.1/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.3.1/search/mag.svg b/doc/v1.3.1/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.3.1/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.3.1/search/mag_d.svg b/doc/v1.3.1/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.3.1/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.3.1/search/mag_sel.svg b/doc/v1.3.1/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.3.1/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.3.1/search/mag_seld.svg b/doc/v1.3.1/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.3.1/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.3.1/search/pages_0.js b/doc/v1.3.1/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.3.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/pages_1.js b/doc/v1.3.1/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.3.1/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/pages_2.js b/doc/v1.3.1/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.3.1/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/pages_3.js b/doc/v1.3.1/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.3.1/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.1/search/search.css b/doc/v1.3.1/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.3.1/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.3.1/search/search.js b/doc/v1.3.1/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.3.1/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.3.1/structxcm__addr__ip.html b/doc/v1.3.1/structxcm__addr__ip.html new file mode 100644 index 000000000..ad198702f --- /dev/null +++ b/doc/v1.3.1/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.3.1/sync_off.png b/doc/v1.3.1/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.3.1/sync_off.png differ diff --git a/doc/v1.3.1/sync_on.png b/doc/v1.3.1/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.3.1/sync_on.png differ diff --git a/doc/v1.3.1/tab_a.png b/doc/v1.3.1/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.3.1/tab_a.png differ diff --git a/doc/v1.3.1/tab_ad.png b/doc/v1.3.1/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.3.1/tab_ad.png differ diff --git a/doc/v1.3.1/tab_b.png b/doc/v1.3.1/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.3.1/tab_b.png differ diff --git a/doc/v1.3.1/tab_bd.png b/doc/v1.3.1/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.3.1/tab_bd.png differ diff --git a/doc/v1.3.1/tab_h.png b/doc/v1.3.1/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.3.1/tab_h.png differ diff --git a/doc/v1.3.1/tab_hd.png b/doc/v1.3.1/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.3.1/tab_hd.png differ diff --git a/doc/v1.3.1/tab_s.png b/doc/v1.3.1/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.3.1/tab_s.png differ diff --git a/doc/v1.3.1/tab_sd.png b/doc/v1.3.1/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.3.1/tab_sd.png differ diff --git a/doc/v1.3.1/tabs.css b/doc/v1.3.1/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.3.1/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.3.1/topics.html b/doc/v1.3.1/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.3.1/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.3.1/xcm_8h.html b/doc/v1.3.1/xcm_8h.html new file mode 100644 index 000000000..f69640af7 --- /dev/null +++ b/doc/v1.3.1/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/xcm_8h_source.html b/doc/v1.3.1/xcm_8h_source.html new file mode 100644 index 000000000..e4c5250be --- /dev/null +++ b/doc/v1.3.1/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1099#include <errno.h>
    +
    1100#include <stdbool.h>
    +
    1101#include <sys/types.h>
    +
    1102
    +
    1103#include <xcm_attr_map.h>
    +
    1104
    +
    1106#define XCM_NONBLOCK (1<<0)
    +
    1107
    +
    1114struct xcm_socket;
    +
    1115
    +
    1166struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1167
    +
    1189struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1190 const struct xcm_attr_map *attrs);
    +
    1191
    +
    1222struct xcm_socket *xcm_server(const char *local_addr);
    +
    1223
    +
    1239struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1240 const struct xcm_attr_map *attrs);
    +
    1241
    +
    1258int xcm_close(struct xcm_socket *socket);
    +
    1259
    +
    1279void xcm_cleanup(struct xcm_socket *socket);
    +
    1280
    +
    1303struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1304
    +
    1321struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1322 const struct xcm_attr_map *attrs);
    +
    1323
    +
    1345int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1346
    +
    1369int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1370
    +
    1373#define XCM_SO_RECEIVABLE (1<<0)
    +
    1376#define XCM_SO_SENDABLE (1<<1)
    +
    1378#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1379
    +
    1440int xcm_await(struct xcm_socket *socket, int condition);
    +
    1441
    +
    1483int xcm_fd(struct xcm_socket *socket);
    +
    1484
    +
    1525int xcm_finish(struct xcm_socket *socket);
    +
    1526
    +
    1567int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1568
    +
    1583bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1584
    +
    1601const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1602
    +
    1617const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1618
    +
    1619#include <xcm_compat.h>
    +
    1620
    +
    1621#ifdef __cplusplus
    +
    1622}
    +
    1623#endif
    +
    1624#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.3.1/xcm__addr_8h.html b/doc/v1.3.1/xcm__addr_8h.html new file mode 100644 index 000000000..347dff672 --- /dev/null +++ b/doc/v1.3.1/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/xcm__addr_8h_source.html b/doc/v1.3.1/xcm__addr_8h_source.html new file mode 100644 index 000000000..03d1b6bed --- /dev/null +++ b/doc/v1.3.1/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.3.1/xcm__attr_8h.html b/doc/v1.3.1/xcm__attr_8h.html new file mode 100644 index 000000000..a44a48c2c --- /dev/null +++ b/doc/v1.3.1/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/xcm__attr_8h_source.html b/doc/v1.3.1/xcm__attr_8h_source.html new file mode 100644 index 000000000..c5f44cbc1 --- /dev/null +++ b/doc/v1.3.1/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.3.1/xcm__attr__map_8h.html b/doc/v1.3.1/xcm__attr__map_8h.html new file mode 100644 index 000000000..d10c8d803 --- /dev/null +++ b/doc/v1.3.1/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/xcm__attr__map_8h_source.html b/doc/v1.3.1/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..bfe58dbcf --- /dev/null +++ b/doc/v1.3.1/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.3.1/xcm__attr__types_8h.html b/doc/v1.3.1/xcm__attr__types_8h.html new file mode 100644 index 000000000..4cdbea65e --- /dev/null +++ b/doc/v1.3.1/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/xcm__attr__types_8h_source.html b/doc/v1.3.1/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..df13296ed --- /dev/null +++ b/doc/v1.3.1/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.3.1/xcm__compat_8h.html b/doc/v1.3.1/xcm__compat_8h.html new file mode 100644 index 000000000..c5f301bc3 --- /dev/null +++ b/doc/v1.3.1/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/xcm__compat_8h_source.html b/doc/v1.3.1/xcm__compat_8h_source.html new file mode 100644 index 000000000..aaf608009 --- /dev/null +++ b/doc/v1.3.1/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.3.1/xcm__version_8h.html b/doc/v1.3.1/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.3.1/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.1/xcm__version_8h_source.html b/doc/v1.3.1/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.3.1/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.3.2/annotated.html b/doc/v1.3.2/annotated.html new file mode 100644 index 000000000..4940ffeb9 --- /dev/null +++ b/doc/v1.3.2/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.3.2/bc_s.png b/doc/v1.3.2/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.3.2/bc_s.png differ diff --git a/doc/v1.3.2/bc_sd.png b/doc/v1.3.2/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.3.2/bc_sd.png differ diff --git a/doc/v1.3.2/classes.html b/doc/v1.3.2/classes.html new file mode 100644 index 000000000..02a5b3b55 --- /dev/null +++ b/doc/v1.3.2/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.3.2/closed.png b/doc/v1.3.2/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.3.2/closed.png differ diff --git a/doc/v1.3.2/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.3.2/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..e7927b3a4 --- /dev/null +++ b/doc/v1.3.2/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.3.2/doc.svg b/doc/v1.3.2/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.3.2/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.2/docd.svg b/doc/v1.3.2/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.3.2/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.2/doxygen.css b/doc/v1.3.2/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.3.2/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.3.2/doxygen.svg b/doc/v1.3.2/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.3.2/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.3.2/dynsections.js b/doc/v1.3.2/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.3.2/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.3.2/files.html b/doc/v1.3.2/files.html new file mode 100644 index 000000000..fa0d24d99 --- /dev/null +++ b/doc/v1.3.2/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.3.2/folderclosed.svg b/doc/v1.3.2/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.3.2/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.3.2/folderclosedd.svg b/doc/v1.3.2/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.3.2/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.3.2/folderopen.svg b/doc/v1.3.2/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.3.2/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.3.2/folderopend.svg b/doc/v1.3.2/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.3.2/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.3.2/functions.html b/doc/v1.3.2/functions.html new file mode 100644 index 000000000..f02487726 --- /dev/null +++ b/doc/v1.3.2/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.3.2/functions_vars.html b/doc/v1.3.2/functions_vars.html new file mode 100644 index 000000000..fdcf93e91 --- /dev/null +++ b/doc/v1.3.2/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.3.2/globals.html b/doc/v1.3.2/globals.html new file mode 100644 index 000000000..26bf55d9c --- /dev/null +++ b/doc/v1.3.2/globals.html @@ -0,0 +1,158 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.3.2/globals_defs.html b/doc/v1.3.2/globals_defs.html new file mode 100644 index 000000000..132c624cf --- /dev/null +++ b/doc/v1.3.2/globals_defs.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.2/globals_enum.html b/doc/v1.3.2/globals_enum.html new file mode 100644 index 000000000..8f8e5958e --- /dev/null +++ b/doc/v1.3.2/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.2/globals_eval.html b/doc/v1.3.2/globals_eval.html new file mode 100644 index 000000000..4c3495f80 --- /dev/null +++ b/doc/v1.3.2/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.2/globals_func.html b/doc/v1.3.2/globals_func.html new file mode 100644 index 000000000..8c990551d --- /dev/null +++ b/doc/v1.3.2/globals_func.html @@ -0,0 +1,138 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.3.2/globals_type.html b/doc/v1.3.2/globals_type.html new file mode 100644 index 000000000..9a60f29a4 --- /dev/null +++ b/doc/v1.3.2/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.3.2/group__api__version.html b/doc/v1.3.2/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.3.2/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/group__lib__version.html b/doc/v1.3.2/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.3.2/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/index.html b/doc/v1.3.2/index.html new file mode 100644 index 000000000..2866a4364 --- /dev/null +++ b/doc/v1.3.2/index.html @@ -0,0 +1,564 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.17 [API]
    +
    +1.3.2 [Implementation]
    +

    The low API/ABI version number is purely a result of all XCM releases being backward compatible, and thus left the major version at 0. It's not to be taken as a sign of immaturity. The API and its implementation have been stable for years.

    +

    +Overview

    +

    XCM provides a connection-oriented, reliable messaging service with in-order delivery. The design goal is to allow for a straight forward mapping to TCP and TLS, but also supporting efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Unlike the BSD Socket API, XCM has uniform semantics across all underlying transports.

    +

    +Overall Service Semantics

    +

    XCM has a client-server model. A server creates a server socket (with xcm_server()) bound to a specific address (in case of TCP or TLS, a TCP port on a particular IP interface), after which clients may initiate connections to the server. On a successful attempt, two connection sockets will be created; one on the server side (returned from xcm_accept()), and one of the client side (returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    Messages are always sent and received on a particular connection socket (and never on a server socket).

    +

    +Ordering Guarantees

    +

    In-order delivery - that messages arrive at the recipient in the same order they were sent by the sender side - is guaranteed, but only for messages sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare indeed in practice. TCP, TLS, and UNIX domain socket transports all have large enough windows and socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, with the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more an abstract addressing format, and internally include multiple "physical" IPC transport options. This model is used by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS and SCTP transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    IPv6 link local addresses are not supported.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +

    For TCP, TLS, UTLS and SCTP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follow the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered messages have successfully be deliver to the lower layer, they may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Message Counter Attributes

    +

    XCM has a set of generic message counters, which keeps track of the number of messages crossing a certain boundary for a particular connection, and a sum of their size.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    All the "xcm.*_bytes" counters count the length of the XCM message payload (as in the length field in xcm_send()), and thus does not include any underlying headers.

    +

    The message counters only count messages succesfully sent and/or received.

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.from_app_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_app_msgs.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.to_app_bytes Connection Integer R The sum of the size of all messages counter by xcm.to_app_msgs.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.from_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.from_lower_msgs.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    xcm.to_lower_bytes Connection Integer R The sum of the size of all messages counted by xcm.to_lower_msgs.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory needs to be created prior to running any XCM applications (for the control interface to worker properly) and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often known as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/doc/v1.3.2/inline_umlgraph_pnghtml.pu b/doc/v1.3.2/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.3.2/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.3.2/jquery.js b/doc/v1.3.2/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.3.2/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.3.2/menu.js b/doc/v1.3.2/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.3.2/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.3.2/menudata.js b/doc/v1.3.2/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.3.2/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.3.2/minus.svg b/doc/v1.3.2/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.3.2/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.3.2/minusd.svg b/doc/v1.3.2/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.3.2/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.3.2/nav_f.png b/doc/v1.3.2/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.3.2/nav_f.png differ diff --git a/doc/v1.3.2/nav_fd.png b/doc/v1.3.2/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.3.2/nav_fd.png differ diff --git a/doc/v1.3.2/nav_g.png b/doc/v1.3.2/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.3.2/nav_g.png differ diff --git a/doc/v1.3.2/nav_h.png b/doc/v1.3.2/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.3.2/nav_h.png differ diff --git a/doc/v1.3.2/nav_hd.png b/doc/v1.3.2/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.3.2/nav_hd.png differ diff --git a/doc/v1.3.2/nb_connect_and_send.png b/doc/v1.3.2/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.3.2/nb_connect_and_send.png differ diff --git a/doc/v1.3.2/nb_connect_explicit.png b/doc/v1.3.2/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.3.2/nb_connect_explicit.png differ diff --git a/doc/v1.3.2/nb_delayed_connection_refused.png b/doc/v1.3.2/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.3.2/nb_delayed_connection_refused.png differ diff --git a/doc/v1.3.2/nb_flush_buffers_before_close.png b/doc/v1.3.2/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.3.2/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.3.2/nb_immediate_connection_refused.png b/doc/v1.3.2/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.3.2/nb_immediate_connection_refused.png differ diff --git a/doc/v1.3.2/open.png b/doc/v1.3.2/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.3.2/open.png differ diff --git a/doc/v1.3.2/plus.svg b/doc/v1.3.2/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.3.2/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.3.2/plusd.svg b/doc/v1.3.2/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.3.2/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.3.2/search/all_0.js b/doc/v1.3.2/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.3.2/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_1.js b/doc/v1.3.2/search/all_1.js new file mode 100644 index 000000000..ee46bfe7e --- /dev/null +++ b/doc/v1.3.2/search/all_1.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_6',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_7',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_8',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_11',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_12',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_13',['attributes',['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_14',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_10.js b/doc/v1.3.2/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.3.2/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_11.js b/doc/v1.3.2/search/all_11.js new file mode 100644 index 000000000..8993846a2 --- /dev/null +++ b/doc/v1.3.2/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Service Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['service_20semantics_8',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['socket_20attributes_9',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_10',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_11',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_12',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_12.js b/doc/v1.3.2/search/all_12.js new file mode 100644 index 000000000..15d6200c6 --- /dev/null +++ b/doc/v1.3.2/search/all_12.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20socket_20attributes_4',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_5',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_6',['transport',['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_7',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_8',['Transports',['../index.html#transports',1,'']]], + ['type_9',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.3.2/search/all_13.js b/doc/v1.3.2/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.3.2/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_14.js b/doc/v1.3.2/search/all_14.js new file mode 100644 index 000000000..d087c6b23 --- /dev/null +++ b/doc/v1.3.2/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_15.js b/doc/v1.3.2/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.3.2/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_16.js b/doc/v1.3.2/search/all_16.js new file mode 100644 index 000000000..b4464f214 --- /dev/null +++ b/doc/v1.3.2/search/all_16.js @@ -0,0 +1,88 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fsctp_7',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_8',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_9',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_10',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_11',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_12',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_13',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_14',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_15',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_16',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_17',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_18',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_19',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_20',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_21',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_22',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_23',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_24',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_25',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_26',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_27',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_28',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_30',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_31',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_32',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_33',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_34',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_35',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_36',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_37',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_38',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_39',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_41',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_47',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_48',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_49',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_50',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_51',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_52',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_53',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_54',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_55',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_56',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_57',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_58',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_59',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_60',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_61',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_62',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_63',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_64',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_65',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_66',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_67',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_68',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_69',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_70',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_71',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_72',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_73',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_74',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_75',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_76',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_77',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_78',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_79',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_80',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_81',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_82',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_83',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_84',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.2/search/all_2.js b/doc/v1.3.2/search/all_2.js new file mode 100644 index 000000000..46a3e1a65 --- /dev/null +++ b/doc/v1.3.2/search/all_2.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['buffer_20flush_20before_20close_5',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_3.js b/doc/v1.3.2/search/all_3.js new file mode 100644 index 000000000..927e04535 --- /dev/null +++ b/doc/v1.3.2/search/all_3.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['close_3',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_5',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_6',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_7',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_8',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_9',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_10',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_11',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_12',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_13',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_14',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_15',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_16',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_17',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_4.js b/doc/v1.3.2/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.3.2/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_5.js b/doc/v1.3.2/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.3.2/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_6.js b/doc/v1.3.2/search/all_6.js new file mode 100644 index 000000000..da16ba1ff --- /dev/null +++ b/doc/v1.3.2/search/all_6.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_3',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_5',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_7.js b/doc/v1.3.2/search/all_7.js new file mode 100644 index 000000000..f5c240716 --- /dev/null +++ b/doc/v1.3.2/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20message_20counter_20attributes_1',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_8.js b/doc/v1.3.2/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.3.2/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.3.2/search/all_9.js b/doc/v1.3.2/search/all_9.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/doc/v1.3.2/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_a.js b/doc/v1.3.2/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.3.2/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_b.js b/doc/v1.3.2/search/all_b.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/doc/v1.3.2/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_c.js b/doc/v1.3.2/search/all_c.js new file mode 100644 index 000000000..f97cb4c2c --- /dev/null +++ b/doc/v1.3.2/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Generic Message Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['multi_20processing_20and_20fork_4',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_5',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_d.js b/doc/v1.3.2/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.3.2/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_e.js b/doc/v1.3.2/search/all_e.js new file mode 100644 index 000000000..22a3a8232 --- /dev/null +++ b/doc/v1.3.2/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20service_20semantics_5',['Overall Service Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.3.2/search/all_f.js b/doc/v1.3.2/search/all_f.js new file mode 100644 index 000000000..8213bfe74 --- /dev/null +++ b/doc/v1.3.2/search/all_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['processing_20and_20fork_2',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_3',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_4',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.3.2/search/classes_0.js b/doc/v1.3.2/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.3.2/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/close.svg b/doc/v1.3.2/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.3.2/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.3.2/search/defines_0.js b/doc/v1.3.2/search/defines_0.js new file mode 100644 index 000000000..6620c9d55 --- /dev/null +++ b/doc/v1.3.2/search/defines_0.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['xcm_5ffd_5fexception_0',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_1',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_2',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_3',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_4',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_5',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_6',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_7',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_8',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_9',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_10',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_11',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_12',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.3.2/search/enums_0.js b/doc/v1.3.2/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.3.2/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.2/search/enumvalues_0.js b/doc/v1.3.2/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.3.2/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.3.2/search/files_0.js b/doc/v1.3.2/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/doc/v1.3.2/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/functions_0.js b/doc/v1.3.2/search/functions_0.js new file mode 100644 index 000000000..347860ce1 --- /dev/null +++ b/doc/v1.3.2/search/functions_0.js @@ -0,0 +1,59 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fsctp_2',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_3',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_4',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_5',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_6',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_7',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_8',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_9',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_10',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_11',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_12',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_13',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_14',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_15',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_16',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_17',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_18',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_19',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_20',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_21',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_22',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_23',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_24',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_25',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_26',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_27',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_28',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_29',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_30',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_31',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_32',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_33',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_34',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_35',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_36',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_37',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_38',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_39',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_40',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_41',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_42',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_43',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_44',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_45',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_46',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_47',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_48',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_49',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_50',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_51',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_52',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_53',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_54',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_55',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.3.2/search/groups_0.js b/doc/v1.3.2/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.3.2/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/groups_1.js b/doc/v1.3.2/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.3.2/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/groups_2.js b/doc/v1.3.2/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.3.2/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.3.2/search/mag.svg b/doc/v1.3.2/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.3.2/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.3.2/search/mag_d.svg b/doc/v1.3.2/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.3.2/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.3.2/search/mag_sel.svg b/doc/v1.3.2/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.3.2/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.3.2/search/mag_seld.svg b/doc/v1.3.2/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.3.2/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.3.2/search/pages_0.js b/doc/v1.3.2/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.3.2/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/pages_1.js b/doc/v1.3.2/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.3.2/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/pages_2.js b/doc/v1.3.2/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.3.2/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/pages_3.js b/doc/v1.3.2/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.3.2/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.3.2/search/search.css b/doc/v1.3.2/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.3.2/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.3.2/search/search.js b/doc/v1.3.2/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.3.2/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.3.2/structxcm__addr__ip.html b/doc/v1.3.2/structxcm__addr__ip.html new file mode 100644 index 000000000..180709d42 --- /dev/null +++ b/doc/v1.3.2/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.3.2/sync_off.png b/doc/v1.3.2/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.3.2/sync_off.png differ diff --git a/doc/v1.3.2/sync_on.png b/doc/v1.3.2/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.3.2/sync_on.png differ diff --git a/doc/v1.3.2/tab_a.png b/doc/v1.3.2/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.3.2/tab_a.png differ diff --git a/doc/v1.3.2/tab_ad.png b/doc/v1.3.2/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.3.2/tab_ad.png differ diff --git a/doc/v1.3.2/tab_b.png b/doc/v1.3.2/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.3.2/tab_b.png differ diff --git a/doc/v1.3.2/tab_bd.png b/doc/v1.3.2/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.3.2/tab_bd.png differ diff --git a/doc/v1.3.2/tab_h.png b/doc/v1.3.2/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.3.2/tab_h.png differ diff --git a/doc/v1.3.2/tab_hd.png b/doc/v1.3.2/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.3.2/tab_hd.png differ diff --git a/doc/v1.3.2/tab_s.png b/doc/v1.3.2/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.3.2/tab_s.png differ diff --git a/doc/v1.3.2/tab_sd.png b/doc/v1.3.2/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.3.2/tab_sd.png differ diff --git a/doc/v1.3.2/tabs.css b/doc/v1.3.2/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.3.2/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.3.2/topics.html b/doc/v1.3.2/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.3.2/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.3.2/xcm_8h.html b/doc/v1.3.2/xcm_8h.html new file mode 100644 index 000000000..766217297 --- /dev/null +++ b/doc/v1.3.2/xcm_8h.html @@ -0,0 +1,912 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive a message.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send a message.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message out on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will be sent on.
    [in]bufA pointer to the message data buffer.
    [in]lenThe length of the message in bytes. Zero-length messages are not allowed.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also Generic Attributes.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive message on a connection socket. A XCM connection goes from a client to a server, and this connection socket may represent either one of the two endpoints.

    +

    If the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the message will receive be on.
    [out]bufThe user-supplied buffer where the incoming message will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the size (> 0 bytes) of the received message, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/xcm_8h_source.html b/doc/v1.3.2/xcm_8h_source.html new file mode 100644 index 000000000..af5e0a184 --- /dev/null +++ b/doc/v1.3.2/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1107#include <errno.h>
    +
    1108#include <stdbool.h>
    +
    1109#include <sys/types.h>
    +
    1110
    +
    1111#include <xcm_attr_map.h>
    +
    1112
    +
    1114#define XCM_NONBLOCK (1<<0)
    +
    1115
    +
    1122struct xcm_socket;
    +
    1123
    +
    1174struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1175
    +
    1197struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1198 const struct xcm_attr_map *attrs);
    +
    1199
    +
    1230struct xcm_socket *xcm_server(const char *local_addr);
    +
    1231
    +
    1247struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1248 const struct xcm_attr_map *attrs);
    +
    1249
    +
    1266int xcm_close(struct xcm_socket *socket);
    +
    1267
    +
    1287void xcm_cleanup(struct xcm_socket *socket);
    +
    1288
    +
    1311struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1312
    +
    1329struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1330 const struct xcm_attr_map *attrs);
    +
    1331
    +
    1353int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1354
    +
    1377int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1378
    +
    1381#define XCM_SO_RECEIVABLE (1<<0)
    +
    1384#define XCM_SO_SENDABLE (1<<1)
    +
    1386#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1387
    +
    1448int xcm_await(struct xcm_socket *socket, int condition);
    +
    1449
    +
    1491int xcm_fd(struct xcm_socket *socket);
    +
    1492
    +
    1533int xcm_finish(struct xcm_socket *socket);
    +
    1534
    +
    1575int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1576
    +
    1591bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1592
    +
    1609const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1610
    +
    1625const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1626
    +
    1627#include <xcm_compat.h>
    +
    1628
    +
    1629#ifdef __cplusplus
    +
    1630}
    +
    1631#endif
    +
    1632#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.3.2/xcm__addr_8h.html b/doc/v1.3.2/xcm__addr_8h.html new file mode 100644 index 000000000..0afa5a88c --- /dev/null +++ b/doc/v1.3.2/xcm__addr_8h.html @@ -0,0 +1,947 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) transport (using file system-based naming).

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/xcm__addr_8h_source.html b/doc/v1.3.2/xcm__addr_8h_source.html new file mode 100644 index 000000000..00ff3247e --- /dev/null +++ b/doc/v1.3.2/xcm__addr_8h_source.html @@ -0,0 +1,205 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    27#define XCM_TLS_PROTO "tls"
    +
    29#define XCM_TCP_PROTO "tcp"
    +
    31#define XCM_SCTP_PROTO "sctp"
    +
    34#define XCM_UX_PROTO "ux"
    +
    37#define XCM_UXF_PROTO "uxf"
    +
    38
    +
    39enum xcm_addr_type {
    +
    40 xcm_addr_type_name,
    +
    41 xcm_addr_type_ip
    +
    42};
    +
    43
    +
    + +
    46{
    +
    48 sa_family_t family;
    +
    49
    +
    51 union {
    +
    54 in_addr_t ip4;
    +
    57 uint8_t ip6[16];
    + +
    59};
    +
    +
    60
    +
    + +
    63{
    +
    65 enum xcm_addr_type type;
    +
    66
    +
    68 union {
    +
    69 struct xcm_addr_ip ip;
    +
    70 /* Max DNS name length is 253 characters */
    +
    71 char name[254];
    +
    72 };
    +
    73};
    +
    +
    74
    +
    88int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    89
    +
    103int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    104 uint16_t *port);
    +
    105
    +
    119int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    120 uint16_t *port);
    +
    121
    +
    136int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    137 uint16_t *port);
    +
    138
    +
    153int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    154 uint16_t *port);
    +
    155
    +
    169int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    170
    +
    184int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    185 size_t capacity);
    +
    186
    +
    202int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    203 char *utls_addr_s, size_t capacity);
    +
    204
    +
    220int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    221 char *tls_addr_s, size_t capacity);
    +
    222
    +
    238int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    239 char *tcp_addr_s, size_t capacity);
    +
    240
    +
    256int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    257 char *sctp_addr_s, size_t capacity);
    +
    258
    +
    273int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    274
    +
    289int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    290
    +
    291#include <xcm_addr_compat.h>
    +
    292
    +
    293#ifdef __cplusplus
    +
    294}
    +
    295#endif
    +
    296#endif
    +
    Definition xcm_addr.h:63
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:65
    +
    Definition xcm_addr.h:46
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:48
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:57
    +
    in_addr_t ip4
    Definition xcm_addr.h:54
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.3.2/xcm__attr_8h.html b/doc/v1.3.2/xcm__attr_8h.html new file mode 100644 index 000000000..d8c6b3955 --- /dev/null +++ b/doc/v1.3.2/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/xcm__attr_8h_source.html b/doc/v1.3.2/xcm__attr_8h_source.html new file mode 100644 index 000000000..30e9615de --- /dev/null +++ b/doc/v1.3.2/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.3.2/xcm__attr__map_8h.html b/doc/v1.3.2/xcm__attr__map_8h.html new file mode 100644 index 000000000..1428b4e0d --- /dev/null +++ b/doc/v1.3.2/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/xcm__attr__map_8h_source.html b/doc/v1.3.2/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..127b82842 --- /dev/null +++ b/doc/v1.3.2/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.3.2/xcm__attr__types_8h.html b/doc/v1.3.2/xcm__attr__types_8h.html new file mode 100644 index 000000000..9a239eead --- /dev/null +++ b/doc/v1.3.2/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/xcm__attr__types_8h_source.html b/doc/v1.3.2/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..a73102a6c --- /dev/null +++ b/doc/v1.3.2/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.3.2/xcm__compat_8h.html b/doc/v1.3.2/xcm__compat_8h.html new file mode 100644 index 000000000..f66bcd667 --- /dev/null +++ b/doc/v1.3.2/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/xcm__compat_8h_source.html b/doc/v1.3.2/xcm__compat_8h_source.html new file mode 100644 index 000000000..8c542116a --- /dev/null +++ b/doc/v1.3.2/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.3.2/xcm__version_8h.html b/doc/v1.3.2/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.3.2/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.3.2/xcm__version_8h_source.html b/doc/v1.3.2/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.3.2/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.4.0/annotated.html b/doc/v1.4.0/annotated.html new file mode 100644 index 000000000..7adac324a --- /dev/null +++ b/doc/v1.4.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.4.0/bc_s.png b/doc/v1.4.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.4.0/bc_s.png differ diff --git a/doc/v1.4.0/bc_sd.png b/doc/v1.4.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.4.0/bc_sd.png differ diff --git a/doc/v1.4.0/classes.html b/doc/v1.4.0/classes.html new file mode 100644 index 000000000..d44449ed2 --- /dev/null +++ b/doc/v1.4.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.4.0/closed.png b/doc/v1.4.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.4.0/closed.png differ diff --git a/doc/v1.4.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.4.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..31627d9cb --- /dev/null +++ b/doc/v1.4.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.4.0/doc.svg b/doc/v1.4.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.4.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.4.0/docd.svg b/doc/v1.4.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.4.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.4.0/doxygen.css b/doc/v1.4.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.4.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.4.0/doxygen.svg b/doc/v1.4.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.4.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.4.0/dynsections.js b/doc/v1.4.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.4.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.4.0/files.html b/doc/v1.4.0/files.html new file mode 100644 index 000000000..9ee012f34 --- /dev/null +++ b/doc/v1.4.0/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.4.0/folderclosed.svg b/doc/v1.4.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.4.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.4.0/folderclosedd.svg b/doc/v1.4.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.4.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.4.0/folderopen.svg b/doc/v1.4.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.4.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.4.0/folderopend.svg b/doc/v1.4.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.4.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.4.0/functions.html b/doc/v1.4.0/functions.html new file mode 100644 index 000000000..6a89b4fee --- /dev/null +++ b/doc/v1.4.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.4.0/functions_vars.html b/doc/v1.4.0/functions_vars.html new file mode 100644 index 000000000..dab18afc3 --- /dev/null +++ b/doc/v1.4.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.4.0/globals.html b/doc/v1.4.0/globals.html new file mode 100644 index 000000000..8c6cf0b39 --- /dev/null +++ b/doc/v1.4.0/globals.html @@ -0,0 +1,161 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.4.0/globals_defs.html b/doc/v1.4.0/globals_defs.html new file mode 100644 index 000000000..38838a1c2 --- /dev/null +++ b/doc/v1.4.0/globals_defs.html @@ -0,0 +1,94 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.4.0/globals_enum.html b/doc/v1.4.0/globals_enum.html new file mode 100644 index 000000000..3d436134d --- /dev/null +++ b/doc/v1.4.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.4.0/globals_eval.html b/doc/v1.4.0/globals_eval.html new file mode 100644 index 000000000..10159c8f0 --- /dev/null +++ b/doc/v1.4.0/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.4.0/globals_func.html b/doc/v1.4.0/globals_func.html new file mode 100644 index 000000000..003906834 --- /dev/null +++ b/doc/v1.4.0/globals_func.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.4.0/globals_type.html b/doc/v1.4.0/globals_type.html new file mode 100644 index 000000000..1533e1183 --- /dev/null +++ b/doc/v1.4.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.4.0/group__api__version.html b/doc/v1.4.0/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.4.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/group__lib__version.html b/doc/v1.4.0/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.4.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/index.html b/doc/v1.4.0/index.html new file mode 100644 index 000000000..bc6c10c2b --- /dev/null +++ b/doc/v1.4.0/index.html @@ -0,0 +1,614 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    + +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.18 [API]
    +
    +1.4.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    IPv6 link local addresses are not supported.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    int rc = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking().
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX And TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default is 3 s.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport uses only TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case the TLS connection is not established.
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header nor anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Limitations

    +

    XCM, in its current form, does not support binding to a local socket before doing connect() - something that is possible with BSD Sockets, but very rarely makes sense.

    +

    XCM also doesn't have a sendmmsg() or recvmmsg() equivalent. Those could easily be added, and would provide some major performance improvements for applications that are sending or receiving multiple messages on the same connection on the same time. *mmsg() equivalents have been left out because there are strong doubts there are such applications.

    +
    +
    + + + + diff --git a/doc/v1.4.0/inline_umlgraph_pnghtml.pu b/doc/v1.4.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.4.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.4.0/jquery.js b/doc/v1.4.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.4.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.4.0/menu.js b/doc/v1.4.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.4.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.4.0/menudata.js b/doc/v1.4.0/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.4.0/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.4.0/minus.svg b/doc/v1.4.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.4.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.4.0/minusd.svg b/doc/v1.4.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.4.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.4.0/nav_f.png b/doc/v1.4.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.4.0/nav_f.png differ diff --git a/doc/v1.4.0/nav_fd.png b/doc/v1.4.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.4.0/nav_fd.png differ diff --git a/doc/v1.4.0/nav_g.png b/doc/v1.4.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.4.0/nav_g.png differ diff --git a/doc/v1.4.0/nav_h.png b/doc/v1.4.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.4.0/nav_h.png differ diff --git a/doc/v1.4.0/nav_hd.png b/doc/v1.4.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.4.0/nav_hd.png differ diff --git a/doc/v1.4.0/nb_connect_and_send.png b/doc/v1.4.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.4.0/nb_connect_and_send.png differ diff --git a/doc/v1.4.0/nb_connect_explicit.png b/doc/v1.4.0/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.4.0/nb_connect_explicit.png differ diff --git a/doc/v1.4.0/nb_delayed_connection_refused.png b/doc/v1.4.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.4.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.4.0/nb_flush_buffers_before_close.png b/doc/v1.4.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.4.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.4.0/nb_immediate_connection_refused.png b/doc/v1.4.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.4.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.4.0/open.png b/doc/v1.4.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.4.0/open.png differ diff --git a/doc/v1.4.0/plus.svg b/doc/v1.4.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.4.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.4.0/plusd.svg b/doc/v1.4.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.4.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.4.0/search/all_0.js b/doc/v1.4.0/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.4.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_1.js b/doc/v1.4.0/search/all_1.js new file mode 100644 index 000000000..c795d6a1e --- /dev/null +++ b/doc/v1.4.0/search/all_1.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_5',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_9',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_10',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_12',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20maps_14',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_15',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_16',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_10.js b/doc/v1.4.0/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.4.0/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_11.js b/doc/v1.4.0/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/doc/v1.4.0/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_12.js b/doc/v1.4.0/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/doc/v1.4.0/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.4.0/search/all_13.js b/doc/v1.4.0/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.4.0/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_14.js b/doc/v1.4.0/search/all_14.js new file mode 100644 index 000000000..062780300 --- /dev/null +++ b/doc/v1.4.0/search/all_14.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_1',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_15.js b/doc/v1.4.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.4.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_16.js b/doc/v1.4.0/search/all_16.js new file mode 100644 index 000000000..fe9fb8005 --- /dev/null +++ b/doc/v1.4.0/search/all_16.js @@ -0,0 +1,91 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_31',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_32',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_33',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_34',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_35',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_36',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_37',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_38',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_39',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_40',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_41',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_42',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_43',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_44',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_45',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_46',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_47',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_48',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_49',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_50',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_51',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_52',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_53',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_54',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_55',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_56',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_57',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_58',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_59',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_60',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_61',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_62',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_63',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_64',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_65',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_66',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_67',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_68',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_69',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_70',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_71',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_72',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_73',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_74',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_75',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_76',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_77',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_78',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_79',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_80',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_81',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_82',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_83',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_84',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_85',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_86',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_87',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.0/search/all_2.js b/doc/v1.4.0/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.4.0/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_3.js b/doc/v1.4.0/search/all_3.js new file mode 100644 index 000000000..a18dc9dfa --- /dev/null +++ b/doc/v1.4.0/search/all_3.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['ciphers_3',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_4',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_5',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_7',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_8',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_9',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_10',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_11',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_12',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_14',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_15',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_16',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_17',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_18',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.4.0/search/all_4.js b/doc/v1.4.0/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.4.0/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_5.js b/doc/v1.4.0/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.4.0/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_6.js b/doc/v1.4.0/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/doc/v1.4.0/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_7.js b/doc/v1.4.0/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.4.0/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_8.js b/doc/v1.4.0/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.4.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.4.0/search/all_9.js b/doc/v1.4.0/search/all_9.js new file mode 100644 index 000000000..62abf2b6a --- /dev/null +++ b/doc/v1.4.0/search/all_9.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['interface_2',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_3',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_4',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_5',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_6',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_7',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_8',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_a.js b/doc/v1.4.0/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.4.0/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_b.js b/doc/v1.4.0/search/all_b.js new file mode 100644 index 000000000..163560678 --- /dev/null +++ b/doc/v1.4.0/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['limitations',['../index.html#limitations',1,'Limitations'],['../index.html#utls_limitations',1,'UTLS Limitations']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_c.js b/doc/v1.4.0/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.4.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_d.js b/doc/v1.4.0/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.4.0/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_e.js b/doc/v1.4.0/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.4.0/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.4.0/search/all_f.js b/doc/v1.4.0/search/all_f.js new file mode 100644 index 000000000..47f4c12e6 --- /dev/null +++ b/doc/v1.4.0/search/all_f.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['processing_20and_20fork_2',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_3',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_4',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.4.0/search/classes_0.js b/doc/v1.4.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.4.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/close.svg b/doc/v1.4.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.4.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.4.0/search/defines_0.js b/doc/v1.4.0/search/defines_0.js new file mode 100644 index 000000000..b435664ff --- /dev/null +++ b/doc/v1.4.0/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.4.0/search/enums_0.js b/doc/v1.4.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.4.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.4.0/search/enumvalues_0.js b/doc/v1.4.0/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.4.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.4.0/search/files_0.js b/doc/v1.4.0/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/doc/v1.4.0/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/functions_0.js b/doc/v1.4.0/search/functions_0.js new file mode 100644 index 000000000..5a4a82e55 --- /dev/null +++ b/doc/v1.4.0/search/functions_0.js @@ -0,0 +1,61 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_23',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_24',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_25',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_26',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_27',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_28',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_29',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_30',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_31',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_32',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_33',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_34',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_35',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_36',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_37',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_38',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_39',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_40',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_41',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_42',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_43',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_44',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_45',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_46',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_47',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_48',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_49',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_50',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_51',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_52',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_53',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_54',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_55',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_56',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_57',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.0/search/groups_0.js b/doc/v1.4.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.4.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/groups_1.js b/doc/v1.4.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.4.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/groups_2.js b/doc/v1.4.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.4.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.4.0/search/mag.svg b/doc/v1.4.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.4.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.4.0/search/mag_d.svg b/doc/v1.4.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.4.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.4.0/search/mag_sel.svg b/doc/v1.4.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.4.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.4.0/search/mag_seld.svg b/doc/v1.4.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.4.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.4.0/search/pages_0.js b/doc/v1.4.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.4.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/pages_1.js b/doc/v1.4.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.4.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/pages_2.js b/doc/v1.4.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.4.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/pages_3.js b/doc/v1.4.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.4.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.0/search/search.css b/doc/v1.4.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.4.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.4.0/search/search.js b/doc/v1.4.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.4.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.4.0/structxcm__addr__ip.html b/doc/v1.4.0/structxcm__addr__ip.html new file mode 100644 index 000000000..d26d4b06e --- /dev/null +++ b/doc/v1.4.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.4.0/sync_off.png b/doc/v1.4.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.4.0/sync_off.png differ diff --git a/doc/v1.4.0/sync_on.png b/doc/v1.4.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.4.0/sync_on.png differ diff --git a/doc/v1.4.0/tab_a.png b/doc/v1.4.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.4.0/tab_a.png differ diff --git a/doc/v1.4.0/tab_ad.png b/doc/v1.4.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.4.0/tab_ad.png differ diff --git a/doc/v1.4.0/tab_b.png b/doc/v1.4.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.4.0/tab_b.png differ diff --git a/doc/v1.4.0/tab_bd.png b/doc/v1.4.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.4.0/tab_bd.png differ diff --git a/doc/v1.4.0/tab_h.png b/doc/v1.4.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.4.0/tab_h.png differ diff --git a/doc/v1.4.0/tab_hd.png b/doc/v1.4.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.4.0/tab_hd.png differ diff --git a/doc/v1.4.0/tab_s.png b/doc/v1.4.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.4.0/tab_s.png differ diff --git a/doc/v1.4.0/tab_sd.png b/doc/v1.4.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.4.0/tab_sd.png differ diff --git a/doc/v1.4.0/tabs.css b/doc/v1.4.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.4.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.4.0/topics.html b/doc/v1.4.0/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.4.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.4.0/xcm_8h.html b/doc/v1.4.0/xcm_8h.html new file mode 100644 index 000000000..828e47ec2 --- /dev/null +++ b/doc/v1.4.0/xcm_8h.html @@ -0,0 +1,914 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    ENOENT DNS domain name resolution failed.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket is denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The limit on the total number of open fds has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EMFILE The limit on the total number of open fds has been reached.
    +

    See xcm_finish() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/xcm_8h_source.html b/doc/v1.4.0/xcm_8h_source.html new file mode 100644 index 000000000..fa01a241a --- /dev/null +++ b/doc/v1.4.0/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1223#include <errno.h>
    +
    1224#include <stdbool.h>
    +
    1225#include <sys/types.h>
    +
    1226
    +
    1227#include <xcm_attr_map.h>
    +
    1228
    +
    1230#define XCM_NONBLOCK (1<<0)
    +
    1231
    +
    1238struct xcm_socket;
    +
    1239
    +
    1294struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1295
    +
    1317struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1318 const struct xcm_attr_map *attrs);
    +
    1319
    +
    1354struct xcm_socket *xcm_server(const char *local_addr);
    +
    1355
    +
    1371struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1372 const struct xcm_attr_map *attrs);
    +
    1373
    +
    1390int xcm_close(struct xcm_socket *socket);
    +
    1391
    +
    1411void xcm_cleanup(struct xcm_socket *socket);
    +
    1412
    +
    1435struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1436
    +
    1453struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1454 const struct xcm_attr_map *attrs);
    +
    1455
    +
    1478int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1479
    +
    1503int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1504
    +
    1507#define XCM_SO_RECEIVABLE (1<<0)
    +
    1510#define XCM_SO_SENDABLE (1<<1)
    +
    1512#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1513
    +
    1574int xcm_await(struct xcm_socket *socket, int condition);
    +
    1575
    +
    1617int xcm_fd(struct xcm_socket *socket);
    +
    1618
    +
    1659int xcm_finish(struct xcm_socket *socket);
    +
    1660
    +
    1701int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1702
    +
    1717bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1718
    +
    1735const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1736
    +
    1751const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1752
    +
    1753#include <xcm_compat.h>
    +
    1754
    +
    1755#ifdef __cplusplus
    +
    1756}
    +
    1757#endif
    +
    1758#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.4.0/xcm__addr_8h.html b/doc/v1.4.0/xcm__addr_8h.html new file mode 100644 index 000000000..361567806 --- /dev/null +++ b/doc/v1.4.0/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/xcm__addr_8h_source.html b/doc/v1.4.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..1ba5a9a1c --- /dev/null +++ b/doc/v1.4.0/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.4.0/xcm__attr_8h.html b/doc/v1.4.0/xcm__attr_8h.html new file mode 100644 index 000000000..98e096ddb --- /dev/null +++ b/doc/v1.4.0/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/xcm__attr_8h_source.html b/doc/v1.4.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..0ab858a66 --- /dev/null +++ b/doc/v1.4.0/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.4.0/xcm__attr__map_8h.html b/doc/v1.4.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..217cef64d --- /dev/null +++ b/doc/v1.4.0/xcm__attr__map_8h.html @@ -0,0 +1,773 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/xcm__attr__map_8h_source.html b/doc/v1.4.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..94d6f247d --- /dev/null +++ b/doc/v1.4.0/xcm__attr__map_8h_source.html @@ -0,0 +1,201 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    128const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    129 const char *attr_name,
    +
    130 enum xcm_attr_type *attr_type,
    +
    131 size_t *attr_value_len);
    +
    132
    +
    133
    +
    148const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    149 const char *attr_name);
    +
    150
    +
    151
    +
    166const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name);
    +
    168
    +
    169
    +
    184const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    185 const char *attr_name);
    +
    186
    +
    195bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    196 const char *attr_name);
    +
    197
    +
    198
    +
    207void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    208
    +
    209
    +
    217size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    218
    +
    219
    +
    223typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    224 enum xcm_attr_type attr_type,
    +
    225 const void *attr_value,
    +
    226 size_t attr_value_len,
    +
    227 void *user);
    +
    228
    +
    229
    +
    242void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    243 xcm_attr_map_foreach_cb cb, void *user);
    +
    244
    +
    245
    +
    254bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    255 const struct xcm_attr_map *attr_map_b);
    +
    256
    +
    265void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    266
    +
    267#ifdef __cplusplus
    +
    268}
    +
    269#endif
    +
    270#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:223
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.4.0/xcm__attr__types_8h.html b/doc/v1.4.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..9c1325a35 --- /dev/null +++ b/doc/v1.4.0/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/xcm__attr__types_8h_source.html b/doc/v1.4.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..bb7a3a6f0 --- /dev/null +++ b/doc/v1.4.0/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.4.0/xcm__compat_8h.html b/doc/v1.4.0/xcm__compat_8h.html new file mode 100644 index 000000000..0eaf976ae --- /dev/null +++ b/doc/v1.4.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/xcm__compat_8h_source.html b/doc/v1.4.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..ce8910c51 --- /dev/null +++ b/doc/v1.4.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.4.0/xcm__version_8h.html b/doc/v1.4.0/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.4.0/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.4.0/xcm__version_8h_source.html b/doc/v1.4.0/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.4.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.4.1/annotated.html b/doc/v1.4.1/annotated.html new file mode 100644 index 000000000..fff4bc45d --- /dev/null +++ b/doc/v1.4.1/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.4.1/bc_s.png b/doc/v1.4.1/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.4.1/bc_s.png differ diff --git a/doc/v1.4.1/bc_sd.png b/doc/v1.4.1/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.4.1/bc_sd.png differ diff --git a/doc/v1.4.1/classes.html b/doc/v1.4.1/classes.html new file mode 100644 index 000000000..835cfd527 --- /dev/null +++ b/doc/v1.4.1/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.4.1/closed.png b/doc/v1.4.1/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.4.1/closed.png differ diff --git a/doc/v1.4.1/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.4.1/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..ece49a19a --- /dev/null +++ b/doc/v1.4.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,107 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
    +
    + + + + diff --git a/doc/v1.4.1/doc.svg b/doc/v1.4.1/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.4.1/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.4.1/docd.svg b/doc/v1.4.1/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.4.1/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.4.1/doxygen.css b/doc/v1.4.1/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.4.1/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.4.1/doxygen.svg b/doc/v1.4.1/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.4.1/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.4.1/dynsections.js b/doc/v1.4.1/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.4.1/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.4.1/files.html b/doc/v1.4.1/files.html new file mode 100644 index 000000000..e4030b125 --- /dev/null +++ b/doc/v1.4.1/files.html @@ -0,0 +1,92 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
    +
    +
    + + + + diff --git a/doc/v1.4.1/folderclosed.svg b/doc/v1.4.1/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.4.1/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.4.1/folderclosedd.svg b/doc/v1.4.1/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.4.1/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.4.1/folderopen.svg b/doc/v1.4.1/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.4.1/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.4.1/folderopend.svg b/doc/v1.4.1/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.4.1/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.4.1/functions.html b/doc/v1.4.1/functions.html new file mode 100644 index 000000000..f7277264b --- /dev/null +++ b/doc/v1.4.1/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.4.1/functions_vars.html b/doc/v1.4.1/functions_vars.html new file mode 100644 index 000000000..d644effb9 --- /dev/null +++ b/doc/v1.4.1/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.4.1/globals.html b/doc/v1.4.1/globals.html new file mode 100644 index 000000000..1e0921687 --- /dev/null +++ b/doc/v1.4.1/globals.html @@ -0,0 +1,162 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.4.1/globals_defs.html b/doc/v1.4.1/globals_defs.html new file mode 100644 index 000000000..5a748ca5d --- /dev/null +++ b/doc/v1.4.1/globals_defs.html @@ -0,0 +1,94 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.4.1/globals_enum.html b/doc/v1.4.1/globals_enum.html new file mode 100644 index 000000000..4110d2d35 --- /dev/null +++ b/doc/v1.4.1/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.4.1/globals_eval.html b/doc/v1.4.1/globals_eval.html new file mode 100644 index 000000000..ef0933afd --- /dev/null +++ b/doc/v1.4.1/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.4.1/globals_func.html b/doc/v1.4.1/globals_func.html new file mode 100644 index 000000000..bd033d641 --- /dev/null +++ b/doc/v1.4.1/globals_func.html @@ -0,0 +1,141 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.4.1/globals_type.html b/doc/v1.4.1/globals_type.html new file mode 100644 index 000000000..0d4fc87c6 --- /dev/null +++ b/doc/v1.4.1/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.4.1/group__api__version.html b/doc/v1.4.1/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.4.1/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/group__lib__version.html b/doc/v1.4.1/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.4.1/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/index.html b/doc/v1.4.1/index.html new file mode 100644 index 000000000..37c0939a7 --- /dev/null +++ b/doc/v1.4.1/index.html @@ -0,0 +1,622 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the documentation for the Extensible Connection-oriented Messaging (XCM) programming APIs.

    +

    XCM consists the core API in xcm.h, an address helper library API in xcm_addr.h, and the attribute APIs in xcm_attr.h and xcm_attr_map.h. Obsolete, but still present, functions are available in xcm_compat.h

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.19 [API]
    +
    +1.4.1 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    IPv6 link local addresses are not supported.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +
    +
    + + + + diff --git a/doc/v1.4.1/inline_umlgraph_pnghtml.pu b/doc/v1.4.1/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.4.1/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.4.1/jquery.js b/doc/v1.4.1/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.4.1/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.4.1/menu.js b/doc/v1.4.1/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.4.1/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.4.1/menudata.js b/doc/v1.4.1/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.4.1/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.4.1/minus.svg b/doc/v1.4.1/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.4.1/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.4.1/minusd.svg b/doc/v1.4.1/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.4.1/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.4.1/nav_f.png b/doc/v1.4.1/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.4.1/nav_f.png differ diff --git a/doc/v1.4.1/nav_fd.png b/doc/v1.4.1/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.4.1/nav_fd.png differ diff --git a/doc/v1.4.1/nav_g.png b/doc/v1.4.1/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.4.1/nav_g.png differ diff --git a/doc/v1.4.1/nav_h.png b/doc/v1.4.1/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.4.1/nav_h.png differ diff --git a/doc/v1.4.1/nav_hd.png b/doc/v1.4.1/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.4.1/nav_hd.png differ diff --git a/doc/v1.4.1/nb_connect_and_send.png b/doc/v1.4.1/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.4.1/nb_connect_and_send.png differ diff --git a/doc/v1.4.1/nb_connect_explicit.png b/doc/v1.4.1/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.4.1/nb_connect_explicit.png differ diff --git a/doc/v1.4.1/nb_delayed_connection_refused.png b/doc/v1.4.1/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.4.1/nb_delayed_connection_refused.png differ diff --git a/doc/v1.4.1/nb_flush_buffers_before_close.png b/doc/v1.4.1/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.4.1/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.4.1/nb_immediate_connection_refused.png b/doc/v1.4.1/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.4.1/nb_immediate_connection_refused.png differ diff --git a/doc/v1.4.1/open.png b/doc/v1.4.1/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.4.1/open.png differ diff --git a/doc/v1.4.1/plus.svg b/doc/v1.4.1/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.4.1/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.4.1/plusd.svg b/doc/v1.4.1/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.4.1/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.4.1/search/all_0.js b/doc/v1.4.1/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.4.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_1.js b/doc/v1.4.1/search/all_1.js new file mode 100644 index 000000000..a0e0a805e --- /dev/null +++ b/doc/v1.4.1/search/all_1.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_5',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_9',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_10',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_12',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_14',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_15',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_16',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_17',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_10.js b/doc/v1.4.1/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.4.1/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_11.js b/doc/v1.4.1/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/doc/v1.4.1/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_12.js b/doc/v1.4.1/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/doc/v1.4.1/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.4.1/search/all_13.js b/doc/v1.4.1/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.4.1/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_14.js b/doc/v1.4.1/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/doc/v1.4.1/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_15.js b/doc/v1.4.1/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.4.1/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_16.js b/doc/v1.4.1/search/all_16.js new file mode 100644 index 000000000..bd5bbb135 --- /dev/null +++ b/doc/v1.4.1/search/all_16.js @@ -0,0 +1,92 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fwant_88',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.1/search/all_2.js b/doc/v1.4.1/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.4.1/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_3.js b/doc/v1.4.1/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/doc/v1.4.1/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.4.1/search/all_4.js b/doc/v1.4.1/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.4.1/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_5.js b/doc/v1.4.1/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.4.1/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_6.js b/doc/v1.4.1/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/doc/v1.4.1/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_7.js b/doc/v1.4.1/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.4.1/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_8.js b/doc/v1.4.1/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.4.1/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.4.1/search/all_9.js b/doc/v1.4.1/search/all_9.js new file mode 100644 index 000000000..20917f6b6 --- /dev/null +++ b/doc/v1.4.1/search/all_9.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_a.js b/doc/v1.4.1/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.4.1/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_b.js b/doc/v1.4.1/search/all_b.js new file mode 100644 index 000000000..d9810deec --- /dev/null +++ b/doc/v1.4.1/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_c.js b/doc/v1.4.1/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.4.1/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_d.js b/doc/v1.4.1/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.4.1/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_e.js b/doc/v1.4.1/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.4.1/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.4.1/search/all_f.js b/doc/v1.4.1/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.4.1/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.4.1/search/classes_0.js b/doc/v1.4.1/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.4.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/close.svg b/doc/v1.4.1/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.4.1/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.4.1/search/defines_0.js b/doc/v1.4.1/search/defines_0.js new file mode 100644 index 000000000..b435664ff --- /dev/null +++ b/doc/v1.4.1/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.4.1/search/enums_0.js b/doc/v1.4.1/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.4.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.4.1/search/enumvalues_0.js b/doc/v1.4.1/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.4.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.4.1/search/files_0.js b/doc/v1.4.1/search/files_0.js new file mode 100644 index 000000000..c4a945c93 --- /dev/null +++ b/doc/v1.4.1/search/files_0.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/functions_0.js b/doc/v1.4.1/search/functions_0.js new file mode 100644 index 000000000..200507791 --- /dev/null +++ b/doc/v1.4.1/search/functions_0.js @@ -0,0 +1,62 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fwant_58',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.4.1/search/groups_0.js b/doc/v1.4.1/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.4.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/groups_1.js b/doc/v1.4.1/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.4.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/groups_2.js b/doc/v1.4.1/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.4.1/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.4.1/search/mag.svg b/doc/v1.4.1/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.4.1/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.4.1/search/mag_d.svg b/doc/v1.4.1/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.4.1/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.4.1/search/mag_sel.svg b/doc/v1.4.1/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.4.1/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.4.1/search/mag_seld.svg b/doc/v1.4.1/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.4.1/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.4.1/search/pages_0.js b/doc/v1.4.1/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.4.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/pages_1.js b/doc/v1.4.1/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.4.1/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/pages_2.js b/doc/v1.4.1/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.4.1/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/pages_3.js b/doc/v1.4.1/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.4.1/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.4.1/search/search.css b/doc/v1.4.1/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.4.1/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.4.1/search/search.js b/doc/v1.4.1/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.4.1/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.4.1/structxcm__addr__ip.html b/doc/v1.4.1/structxcm__addr__ip.html new file mode 100644 index 000000000..5c5def06f --- /dev/null +++ b/doc/v1.4.1/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.4.1/sync_off.png b/doc/v1.4.1/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.4.1/sync_off.png differ diff --git a/doc/v1.4.1/sync_on.png b/doc/v1.4.1/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.4.1/sync_on.png differ diff --git a/doc/v1.4.1/tab_a.png b/doc/v1.4.1/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.4.1/tab_a.png differ diff --git a/doc/v1.4.1/tab_ad.png b/doc/v1.4.1/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.4.1/tab_ad.png differ diff --git a/doc/v1.4.1/tab_b.png b/doc/v1.4.1/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.4.1/tab_b.png differ diff --git a/doc/v1.4.1/tab_bd.png b/doc/v1.4.1/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.4.1/tab_bd.png differ diff --git a/doc/v1.4.1/tab_h.png b/doc/v1.4.1/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.4.1/tab_h.png differ diff --git a/doc/v1.4.1/tab_hd.png b/doc/v1.4.1/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.4.1/tab_hd.png differ diff --git a/doc/v1.4.1/tab_s.png b/doc/v1.4.1/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.4.1/tab_s.png differ diff --git a/doc/v1.4.1/tab_sd.png b/doc/v1.4.1/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.4.1/tab_sd.png differ diff --git a/doc/v1.4.1/tabs.css b/doc/v1.4.1/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.4.1/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.4.1/topics.html b/doc/v1.4.1/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.4.1/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.4.1/xcm_8h.html b/doc/v1.4.1/xcm_8h.html new file mode 100644 index 000000000..9ed8bbbea --- /dev/null +++ b/doc/v1.4.1/xcm_8h.html @@ -0,0 +1,915 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/xcm_8h_source.html b/doc/v1.4.1/xcm_8h_source.html new file mode 100644 index 000000000..3daaa811b --- /dev/null +++ b/doc/v1.4.1/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1238#include <errno.h>
    +
    1239#include <stdbool.h>
    +
    1240#include <sys/types.h>
    +
    1241
    +
    1242#include <xcm_attr_map.h>
    +
    1243
    +
    1245#define XCM_NONBLOCK (1<<0)
    +
    1246
    +
    1253struct xcm_socket;
    +
    1254
    +
    1307struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1308
    +
    1330struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1331 const struct xcm_attr_map *attrs);
    +
    1332
    +
    1368struct xcm_socket *xcm_server(const char *local_addr);
    +
    1369
    +
    1385struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1386 const struct xcm_attr_map *attrs);
    +
    1387
    +
    1404int xcm_close(struct xcm_socket *socket);
    +
    1405
    +
    1425void xcm_cleanup(struct xcm_socket *socket);
    +
    1426
    +
    1445struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1446
    +
    1466struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1467 const struct xcm_attr_map *attrs);
    +
    1468
    +
    1491int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1492
    +
    1516int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1517
    +
    1520#define XCM_SO_RECEIVABLE (1<<0)
    +
    1523#define XCM_SO_SENDABLE (1<<1)
    +
    1525#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1526
    +
    1587int xcm_await(struct xcm_socket *socket, int condition);
    +
    1588
    +
    1630int xcm_fd(struct xcm_socket *socket);
    +
    1631
    +
    1676int xcm_finish(struct xcm_socket *socket);
    +
    1677
    +
    1718int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1719
    +
    1734bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1735
    +
    1752const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1753
    +
    1768const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1769
    +
    1770#include <xcm_compat.h>
    +
    1771
    +
    1772#ifdef __cplusplus
    +
    1773}
    +
    1774#endif
    +
    1775#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.4.1/xcm__addr_8h.html b/doc/v1.4.1/xcm__addr_8h.html new file mode 100644 index 000000000..33820ac27 --- /dev/null +++ b/doc/v1.4.1/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/xcm__addr_8h_source.html b/doc/v1.4.1/xcm__addr_8h_source.html new file mode 100644 index 000000000..ea6916b9a --- /dev/null +++ b/doc/v1.4.1/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.4.1/xcm__attr_8h.html b/doc/v1.4.1/xcm__attr_8h.html new file mode 100644 index 000000000..4c43673b8 --- /dev/null +++ b/doc/v1.4.1/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/xcm__attr_8h_source.html b/doc/v1.4.1/xcm__attr_8h_source.html new file mode 100644 index 000000000..8cb670fed --- /dev/null +++ b/doc/v1.4.1/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.4.1/xcm__attr__map_8h.html b/doc/v1.4.1/xcm__attr__map_8h.html new file mode 100644 index 000000000..ad298367f --- /dev/null +++ b/doc/v1.4.1/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/xcm__attr__map_8h_source.html b/doc/v1.4.1/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..423f3fb1b --- /dev/null +++ b/doc/v1.4.1/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.4.1/xcm__attr__types_8h.html b/doc/v1.4.1/xcm__attr__types_8h.html new file mode 100644 index 000000000..3b2e331ca --- /dev/null +++ b/doc/v1.4.1/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/xcm__attr__types_8h_source.html b/doc/v1.4.1/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..ca41d433e --- /dev/null +++ b/doc/v1.4.1/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.4.1/xcm__compat_8h.html b/doc/v1.4.1/xcm__compat_8h.html new file mode 100644 index 000000000..c2c159b74 --- /dev/null +++ b/doc/v1.4.1/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/xcm__compat_8h_source.html b/doc/v1.4.1/xcm__compat_8h_source.html new file mode 100644 index 000000000..fbda2c1fd --- /dev/null +++ b/doc/v1.4.1/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.4.1/xcm__version_8h.html b/doc/v1.4.1/xcm__version_8h.html new file mode 100644 index 000000000..85a9d6930 --- /dev/null +++ b/doc/v1.4.1/xcm__version_8h.html @@ -0,0 +1,274 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    Functions and macros to retrieve XCM versioning information. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    Functions and macros to retrieve XCM versioning information.

    +

    The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.4.1/xcm__version_8h_source.html b/doc/v1.4.1/xcm__version_8h_source.html new file mode 100644 index 000000000..55a59f244 --- /dev/null +++ b/doc/v1.4.1/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    26#define XCM_VERSION_MAJOR 1
    +
    27
    +
    29#define XCM_VERSION_MINOR 11
    +
    30
    +
    32#define XCM_VERSION_PATCH 0
    +
    33
    +
    35#define XCM_VERSION "1.11.0"
    +
    36
    +
    45#define XCM_VERSION_API_MAJOR 0
    +
    46
    +
    48#define XCM_VERSION_API_MINOR 26
    +
    49
    +
    51#define XCM_VERSION_API "0.26"
    +
    52
    +
    60unsigned int xcm_version_major(void);
    +
    61
    +
    68unsigned int xcm_version_minor(void);
    +
    69
    +
    75unsigned int xcm_version_patch(void);
    +
    76
    +
    85const char *xcm_version(void);
    +
    86
    +
    92unsigned int xcm_version_api_major(void);
    +
    93
    +
    99unsigned int xcm_version_api_minor(void);
    +
    100
    +
    109const char *xcm_version_api(void);
    +
    110
    +
    111#ifdef __cplusplus
    +
    112}
    +
    113#endif
    +
    114#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.5.0/annotated.html b/doc/v1.5.0/annotated.html new file mode 100644 index 000000000..af995b685 --- /dev/null +++ b/doc/v1.5.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.5.0/bc_s.png b/doc/v1.5.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.5.0/bc_s.png differ diff --git a/doc/v1.5.0/bc_sd.png b/doc/v1.5.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.5.0/bc_sd.png differ diff --git a/doc/v1.5.0/classes.html b/doc/v1.5.0/classes.html new file mode 100644 index 000000000..b7ea6e2c9 --- /dev/null +++ b/doc/v1.5.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.5.0/closed.png b/doc/v1.5.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.5.0/closed.png differ diff --git a/doc/v1.5.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.5.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..eb99724e3 --- /dev/null +++ b/doc/v1.5.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.5.0/doc.svg b/doc/v1.5.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.5.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.5.0/docd.svg b/doc/v1.5.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.5.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.5.0/doxygen.css b/doc/v1.5.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.5.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.5.0/doxygen.svg b/doc/v1.5.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.5.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.5.0/dynsections.js b/doc/v1.5.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.5.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.5.0/files.html b/doc/v1.5.0/files.html new file mode 100644 index 000000000..ea8352f79 --- /dev/null +++ b/doc/v1.5.0/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.5.0/folderclosed.svg b/doc/v1.5.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.5.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.5.0/folderclosedd.svg b/doc/v1.5.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.5.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.5.0/folderopen.svg b/doc/v1.5.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.5.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.5.0/folderopend.svg b/doc/v1.5.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.5.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.5.0/functions.html b/doc/v1.5.0/functions.html new file mode 100644 index 000000000..6d8f2308a --- /dev/null +++ b/doc/v1.5.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.5.0/functions_vars.html b/doc/v1.5.0/functions_vars.html new file mode 100644 index 000000000..0567000b1 --- /dev/null +++ b/doc/v1.5.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.5.0/globals.html b/doc/v1.5.0/globals.html new file mode 100644 index 000000000..4e085ed5a --- /dev/null +++ b/doc/v1.5.0/globals.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.5.0/globals_defs.html b/doc/v1.5.0/globals_defs.html new file mode 100644 index 000000000..84167443e --- /dev/null +++ b/doc/v1.5.0/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.5.0/globals_enum.html b/doc/v1.5.0/globals_enum.html new file mode 100644 index 000000000..5e6b009d0 --- /dev/null +++ b/doc/v1.5.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.5.0/globals_eval.html b/doc/v1.5.0/globals_eval.html new file mode 100644 index 000000000..fceaa454d --- /dev/null +++ b/doc/v1.5.0/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.5.0/globals_func.html b/doc/v1.5.0/globals_func.html new file mode 100644 index 000000000..9d1cb2636 --- /dev/null +++ b/doc/v1.5.0/globals_func.html @@ -0,0 +1,148 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.5.0/globals_type.html b/doc/v1.5.0/globals_type.html new file mode 100644 index 000000000..fd4fe6bb8 --- /dev/null +++ b/doc/v1.5.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.5.0/group__api__version.html b/doc/v1.5.0/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.5.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/group__lib__version.html b/doc/v1.5.0/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.5.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/index.html b/doc/v1.5.0/index.html new file mode 100644 index 000000000..0c8aff87a --- /dev/null +++ b/doc/v1.5.0/index.html @@ -0,0 +1,628 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.20 [API]
    +
    +1.5.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    IPv6 link local addresses are not supported.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +
    +
    + + + + diff --git a/doc/v1.5.0/inline_umlgraph_pnghtml.pu b/doc/v1.5.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.5.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.5.0/jquery.js b/doc/v1.5.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.5.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.5.0/menu.js b/doc/v1.5.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.5.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.5.0/menudata.js b/doc/v1.5.0/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.5.0/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.5.0/minus.svg b/doc/v1.5.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.5.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.5.0/minusd.svg b/doc/v1.5.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.5.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.5.0/nav_f.png b/doc/v1.5.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.5.0/nav_f.png differ diff --git a/doc/v1.5.0/nav_fd.png b/doc/v1.5.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.5.0/nav_fd.png differ diff --git a/doc/v1.5.0/nav_g.png b/doc/v1.5.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.5.0/nav_g.png differ diff --git a/doc/v1.5.0/nav_h.png b/doc/v1.5.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.5.0/nav_h.png differ diff --git a/doc/v1.5.0/nav_hd.png b/doc/v1.5.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.5.0/nav_hd.png differ diff --git a/doc/v1.5.0/nb_connect_and_send.png b/doc/v1.5.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.5.0/nb_connect_and_send.png differ diff --git a/doc/v1.5.0/nb_connect_explicit.png b/doc/v1.5.0/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.5.0/nb_connect_explicit.png differ diff --git a/doc/v1.5.0/nb_delayed_connection_refused.png b/doc/v1.5.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.5.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.5.0/nb_flush_buffers_before_close.png b/doc/v1.5.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.5.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.5.0/nb_immediate_connection_refused.png b/doc/v1.5.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.5.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.5.0/open.png b/doc/v1.5.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.5.0/open.png differ diff --git a/doc/v1.5.0/plus.svg b/doc/v1.5.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.5.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.5.0/plusd.svg b/doc/v1.5.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.5.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.5.0/search/all_0.js b/doc/v1.5.0/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.5.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_1.js b/doc/v1.5.0/search/all_1.js new file mode 100644 index 000000000..a0e0a805e --- /dev/null +++ b/doc/v1.5.0/search/all_1.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_5',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_9',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_10',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_12',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_14',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_15',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_16',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_17',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_10.js b/doc/v1.5.0/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.5.0/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_11.js b/doc/v1.5.0/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/doc/v1.5.0/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_12.js b/doc/v1.5.0/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/doc/v1.5.0/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.5.0/search/all_13.js b/doc/v1.5.0/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.5.0/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_14.js b/doc/v1.5.0/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/doc/v1.5.0/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_15.js b/doc/v1.5.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.5.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_16.js b/doc/v1.5.0/search/all_16.js new file mode 100644 index 000000000..d9b2d4bae --- /dev/null +++ b/doc/v1.5.0/search/all_16.js @@ -0,0 +1,100 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_88',['xcm_version',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_89',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_90',['xcm_version_api',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_91',['xcm_version_api_major',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_92',['xcm_version_api_minor',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_93',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h'],['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h']]], + ['xcm_5fversion_5fminor_94',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h'],['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h']]], + ['xcm_5fversion_5fpatch_95',['xcm_version_patch',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_96',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.0/search/all_2.js b/doc/v1.5.0/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.5.0/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_3.js b/doc/v1.5.0/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/doc/v1.5.0/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.5.0/search/all_4.js b/doc/v1.5.0/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.5.0/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_5.js b/doc/v1.5.0/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.5.0/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_6.js b/doc/v1.5.0/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/doc/v1.5.0/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_7.js b/doc/v1.5.0/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.5.0/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_8.js b/doc/v1.5.0/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.5.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.5.0/search/all_9.js b/doc/v1.5.0/search/all_9.js new file mode 100644 index 000000000..20917f6b6 --- /dev/null +++ b/doc/v1.5.0/search/all_9.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_a.js b/doc/v1.5.0/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.5.0/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_b.js b/doc/v1.5.0/search/all_b.js new file mode 100644 index 000000000..d9810deec --- /dev/null +++ b/doc/v1.5.0/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_c.js b/doc/v1.5.0/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.5.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_d.js b/doc/v1.5.0/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.5.0/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_e.js b/doc/v1.5.0/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.5.0/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.5.0/search/all_f.js b/doc/v1.5.0/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.5.0/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.5.0/search/classes_0.js b/doc/v1.5.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.5.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/close.svg b/doc/v1.5.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.5.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.5.0/search/defines_0.js b/doc/v1.5.0/search/defines_0.js new file mode 100644 index 000000000..d981023a8 --- /dev/null +++ b/doc/v1.5.0/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_14',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_15',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_16',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_17',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_18',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_19',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_20',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.5.0/search/enums_0.js b/doc/v1.5.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.5.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.5.0/search/enumvalues_0.js b/doc/v1.5.0/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.5.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.5.0/search/files_0.js b/doc/v1.5.0/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.5.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/functions_0.js b/doc/v1.5.0/search/functions_0.js new file mode 100644 index 000000000..1e1147b3e --- /dev/null +++ b/doc/v1.5.0/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_58',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_59',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_60',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_61',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_62',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_63',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_64',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_65',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.0/search/groups_0.js b/doc/v1.5.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.5.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/groups_1.js b/doc/v1.5.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.5.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/groups_2.js b/doc/v1.5.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.5.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.5.0/search/mag.svg b/doc/v1.5.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.5.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.5.0/search/mag_d.svg b/doc/v1.5.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.5.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.5.0/search/mag_sel.svg b/doc/v1.5.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.5.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.5.0/search/mag_seld.svg b/doc/v1.5.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.5.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.5.0/search/pages_0.js b/doc/v1.5.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.5.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/pages_1.js b/doc/v1.5.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.5.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/pages_2.js b/doc/v1.5.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.5.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/pages_3.js b/doc/v1.5.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.5.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.0/search/search.css b/doc/v1.5.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.5.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.5.0/search/search.js b/doc/v1.5.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.5.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.5.0/structxcm__addr__ip.html b/doc/v1.5.0/structxcm__addr__ip.html new file mode 100644 index 000000000..f8bff270a --- /dev/null +++ b/doc/v1.5.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.5.0/sync_off.png b/doc/v1.5.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.5.0/sync_off.png differ diff --git a/doc/v1.5.0/sync_on.png b/doc/v1.5.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.5.0/sync_on.png differ diff --git a/doc/v1.5.0/tab_a.png b/doc/v1.5.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.5.0/tab_a.png differ diff --git a/doc/v1.5.0/tab_ad.png b/doc/v1.5.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.5.0/tab_ad.png differ diff --git a/doc/v1.5.0/tab_b.png b/doc/v1.5.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.5.0/tab_b.png differ diff --git a/doc/v1.5.0/tab_bd.png b/doc/v1.5.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.5.0/tab_bd.png differ diff --git a/doc/v1.5.0/tab_h.png b/doc/v1.5.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.5.0/tab_h.png differ diff --git a/doc/v1.5.0/tab_hd.png b/doc/v1.5.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.5.0/tab_hd.png differ diff --git a/doc/v1.5.0/tab_s.png b/doc/v1.5.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.5.0/tab_s.png differ diff --git a/doc/v1.5.0/tab_sd.png b/doc/v1.5.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.5.0/tab_sd.png differ diff --git a/doc/v1.5.0/tabs.css b/doc/v1.5.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.5.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.5.0/topics.html b/doc/v1.5.0/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.5.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.5.0/xcm_8h.html b/doc/v1.5.0/xcm_8h.html new file mode 100644 index 000000000..e70669ccc --- /dev/null +++ b/doc/v1.5.0/xcm_8h.html @@ -0,0 +1,915 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/xcm_8h_source.html b/doc/v1.5.0/xcm_8h_source.html new file mode 100644 index 000000000..820db5b1e --- /dev/null +++ b/doc/v1.5.0/xcm_8h_source.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1240#include <errno.h>
    +
    1241#include <stdbool.h>
    +
    1242#include <sys/types.h>
    +
    1243#include <xcm_attr_map.h>
    +
    1244
    +
    1246#define XCM_NONBLOCK (1<<0)
    +
    1247
    +
    1254struct xcm_socket;
    +
    1255
    +
    1308struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1309
    +
    1331struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1332 const struct xcm_attr_map *attrs);
    +
    1333
    +
    1369struct xcm_socket *xcm_server(const char *local_addr);
    +
    1370
    +
    1386struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1387 const struct xcm_attr_map *attrs);
    +
    1388
    +
    1405int xcm_close(struct xcm_socket *socket);
    +
    1406
    +
    1426void xcm_cleanup(struct xcm_socket *socket);
    +
    1427
    +
    1446struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1447
    +
    1467struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1468 const struct xcm_attr_map *attrs);
    +
    1469
    +
    1492int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1493
    +
    1517int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1518
    +
    1521#define XCM_SO_RECEIVABLE (1<<0)
    +
    1524#define XCM_SO_SENDABLE (1<<1)
    +
    1526#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1527
    +
    1588int xcm_await(struct xcm_socket *socket, int condition);
    +
    1589
    +
    1631int xcm_fd(struct xcm_socket *socket);
    +
    1632
    +
    1677int xcm_finish(struct xcm_socket *socket);
    +
    1678
    +
    1719int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1720
    +
    1735bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1736
    +
    1753const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1754
    +
    1769const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1770
    +
    1771#include <xcm_compat.h>
    +
    1772
    +
    1773#ifdef __cplusplus
    +
    1774}
    +
    1775#endif
    +
    1776#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.5.0/xcm__addr_8h.html b/doc/v1.5.0/xcm__addr_8h.html new file mode 100644 index 000000000..50d0cc508 --- /dev/null +++ b/doc/v1.5.0/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/xcm__addr_8h_source.html b/doc/v1.5.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..3323eb7ec --- /dev/null +++ b/doc/v1.5.0/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.5.0/xcm__attr_8h.html b/doc/v1.5.0/xcm__attr_8h.html new file mode 100644 index 000000000..225953fcc --- /dev/null +++ b/doc/v1.5.0/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/xcm__attr_8h_source.html b/doc/v1.5.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..5cde8d109 --- /dev/null +++ b/doc/v1.5.0/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.5.0/xcm__attr__map_8h.html b/doc/v1.5.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..f6b4ff755 --- /dev/null +++ b/doc/v1.5.0/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/xcm__attr__map_8h_source.html b/doc/v1.5.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..d2a56b8fe --- /dev/null +++ b/doc/v1.5.0/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.5.0/xcm__attr__types_8h.html b/doc/v1.5.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..e738b7ce5 --- /dev/null +++ b/doc/v1.5.0/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/xcm__attr__types_8h_source.html b/doc/v1.5.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..1a13282d9 --- /dev/null +++ b/doc/v1.5.0/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.5.0/xcm__compat_8h.html b/doc/v1.5.0/xcm__compat_8h.html new file mode 100644 index 000000000..46f4fa620 --- /dev/null +++ b/doc/v1.5.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/xcm__compat_8h_source.html b/doc/v1.5.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..f93712cd4 --- /dev/null +++ b/doc/v1.5.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.5.0/xcm__version_8h.html b/doc/v1.5.0/xcm__version_8h.html new file mode 100644 index 000000000..9e815e1a0 --- /dev/null +++ b/doc/v1.5.0/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.5.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.5.0/xcm__version_8h_source.html b/doc/v1.5.0/xcm__version_8h_source.html new file mode 100644 index 000000000..890d62c95 --- /dev/null +++ b/doc/v1.5.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.5.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.5.1/annotated.html b/doc/v1.5.1/annotated.html new file mode 100644 index 000000000..95a7262b2 --- /dev/null +++ b/doc/v1.5.1/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.5.1/bc_s.png b/doc/v1.5.1/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.5.1/bc_s.png differ diff --git a/doc/v1.5.1/bc_sd.png b/doc/v1.5.1/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.5.1/bc_sd.png differ diff --git a/doc/v1.5.1/classes.html b/doc/v1.5.1/classes.html new file mode 100644 index 000000000..86f2d4786 --- /dev/null +++ b/doc/v1.5.1/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.5.1/closed.png b/doc/v1.5.1/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.5.1/closed.png differ diff --git a/doc/v1.5.1/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.5.1/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..5fc79fa40 --- /dev/null +++ b/doc/v1.5.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.5.1/doc.svg b/doc/v1.5.1/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.5.1/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.5.1/docd.svg b/doc/v1.5.1/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.5.1/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.5.1/doxygen.css b/doc/v1.5.1/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.5.1/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.5.1/doxygen.svg b/doc/v1.5.1/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.5.1/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.5.1/dynsections.js b/doc/v1.5.1/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.5.1/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.5.1/files.html b/doc/v1.5.1/files.html new file mode 100644 index 000000000..3f244a020 --- /dev/null +++ b/doc/v1.5.1/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.5.1/folderclosed.svg b/doc/v1.5.1/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.5.1/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.5.1/folderclosedd.svg b/doc/v1.5.1/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.5.1/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.5.1/folderopen.svg b/doc/v1.5.1/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.5.1/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.5.1/folderopend.svg b/doc/v1.5.1/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.5.1/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.5.1/functions.html b/doc/v1.5.1/functions.html new file mode 100644 index 000000000..92f4eb54d --- /dev/null +++ b/doc/v1.5.1/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.5.1/functions_vars.html b/doc/v1.5.1/functions_vars.html new file mode 100644 index 000000000..65bb961b0 --- /dev/null +++ b/doc/v1.5.1/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.5.1/globals.html b/doc/v1.5.1/globals.html new file mode 100644 index 000000000..99ef8eb7a --- /dev/null +++ b/doc/v1.5.1/globals.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.5.1/globals_defs.html b/doc/v1.5.1/globals_defs.html new file mode 100644 index 000000000..e0b38dd83 --- /dev/null +++ b/doc/v1.5.1/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.5.1/globals_enum.html b/doc/v1.5.1/globals_enum.html new file mode 100644 index 000000000..f81f4a7c6 --- /dev/null +++ b/doc/v1.5.1/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.5.1/globals_eval.html b/doc/v1.5.1/globals_eval.html new file mode 100644 index 000000000..6f94d4040 --- /dev/null +++ b/doc/v1.5.1/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.5.1/globals_func.html b/doc/v1.5.1/globals_func.html new file mode 100644 index 000000000..ae95dc55c --- /dev/null +++ b/doc/v1.5.1/globals_func.html @@ -0,0 +1,148 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.5.1/globals_type.html b/doc/v1.5.1/globals_type.html new file mode 100644 index 000000000..f43a884fd --- /dev/null +++ b/doc/v1.5.1/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.5.1/group__api__version.html b/doc/v1.5.1/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.5.1/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/group__lib__version.html b/doc/v1.5.1/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.5.1/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/index.html b/doc/v1.5.1/index.html new file mode 100644 index 000000000..603592572 --- /dev/null +++ b/doc/v1.5.1/index.html @@ -0,0 +1,628 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.20 [API]
    +
    +1.5.1 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    IPv6 link local addresses are not supported.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +
    +
    + + + + diff --git a/doc/v1.5.1/inline_umlgraph_pnghtml.pu b/doc/v1.5.1/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.5.1/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.5.1/jquery.js b/doc/v1.5.1/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.5.1/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.5.1/menu.js b/doc/v1.5.1/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.5.1/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.5.1/menudata.js b/doc/v1.5.1/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.5.1/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.5.1/minus.svg b/doc/v1.5.1/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.5.1/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.5.1/minusd.svg b/doc/v1.5.1/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.5.1/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.5.1/nav_f.png b/doc/v1.5.1/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.5.1/nav_f.png differ diff --git a/doc/v1.5.1/nav_fd.png b/doc/v1.5.1/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.5.1/nav_fd.png differ diff --git a/doc/v1.5.1/nav_g.png b/doc/v1.5.1/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.5.1/nav_g.png differ diff --git a/doc/v1.5.1/nav_h.png b/doc/v1.5.1/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.5.1/nav_h.png differ diff --git a/doc/v1.5.1/nav_hd.png b/doc/v1.5.1/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.5.1/nav_hd.png differ diff --git a/doc/v1.5.1/nb_connect_and_send.png b/doc/v1.5.1/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.5.1/nb_connect_and_send.png differ diff --git a/doc/v1.5.1/nb_connect_explicit.png b/doc/v1.5.1/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.5.1/nb_connect_explicit.png differ diff --git a/doc/v1.5.1/nb_delayed_connection_refused.png b/doc/v1.5.1/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.5.1/nb_delayed_connection_refused.png differ diff --git a/doc/v1.5.1/nb_flush_buffers_before_close.png b/doc/v1.5.1/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.5.1/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.5.1/nb_immediate_connection_refused.png b/doc/v1.5.1/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.5.1/nb_immediate_connection_refused.png differ diff --git a/doc/v1.5.1/open.png b/doc/v1.5.1/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.5.1/open.png differ diff --git a/doc/v1.5.1/plus.svg b/doc/v1.5.1/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.5.1/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.5.1/plusd.svg b/doc/v1.5.1/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.5.1/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.5.1/search/all_0.js b/doc/v1.5.1/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.5.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_1.js b/doc/v1.5.1/search/all_1.js new file mode 100644 index 000000000..a0e0a805e --- /dev/null +++ b/doc/v1.5.1/search/all_1.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addressing_20and_20transport_20selection_4',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_5',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_7',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_9',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_10',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_12',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_13',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_14',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_15',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_16',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_17',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_10.js b/doc/v1.5.1/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.5.1/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_11.js b/doc/v1.5.1/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/doc/v1.5.1/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_12.js b/doc/v1.5.1/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/doc/v1.5.1/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.5.1/search/all_13.js b/doc/v1.5.1/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.5.1/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_14.js b/doc/v1.5.1/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/doc/v1.5.1/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_15.js b/doc/v1.5.1/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.5.1/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_16.js b/doc/v1.5.1/search/all_16.js new file mode 100644 index 000000000..d9b2d4bae --- /dev/null +++ b/doc/v1.5.1/search/all_16.js @@ -0,0 +1,100 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_88',['xcm_version',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_89',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_90',['xcm_version_api',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_91',['xcm_version_api_major',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_92',['xcm_version_api_minor',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_93',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h'],['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h']]], + ['xcm_5fversion_5fminor_94',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h'],['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h']]], + ['xcm_5fversion_5fpatch_95',['xcm_version_patch',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_96',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.1/search/all_2.js b/doc/v1.5.1/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.5.1/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_3.js b/doc/v1.5.1/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/doc/v1.5.1/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.5.1/search/all_4.js b/doc/v1.5.1/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.5.1/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_5.js b/doc/v1.5.1/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.5.1/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_6.js b/doc/v1.5.1/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/doc/v1.5.1/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_7.js b/doc/v1.5.1/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.5.1/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_8.js b/doc/v1.5.1/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.5.1/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.5.1/search/all_9.js b/doc/v1.5.1/search/all_9.js new file mode 100644 index 000000000..20917f6b6 --- /dev/null +++ b/doc/v1.5.1/search/all_9.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_a.js b/doc/v1.5.1/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.5.1/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_b.js b/doc/v1.5.1/search/all_b.js new file mode 100644 index 000000000..d9810deec --- /dev/null +++ b/doc/v1.5.1/search/all_b.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_2',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_c.js b/doc/v1.5.1/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.5.1/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_d.js b/doc/v1.5.1/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.5.1/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_e.js b/doc/v1.5.1/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.5.1/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.5.1/search/all_f.js b/doc/v1.5.1/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.5.1/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.5.1/search/classes_0.js b/doc/v1.5.1/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.5.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/close.svg b/doc/v1.5.1/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.5.1/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.5.1/search/defines_0.js b/doc/v1.5.1/search/defines_0.js new file mode 100644 index 000000000..d981023a8 --- /dev/null +++ b/doc/v1.5.1/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_14',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_15',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_16',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_17',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_18',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_19',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_20',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.5.1/search/enums_0.js b/doc/v1.5.1/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.5.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.5.1/search/enumvalues_0.js b/doc/v1.5.1/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.5.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.5.1/search/files_0.js b/doc/v1.5.1/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.5.1/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/functions_0.js b/doc/v1.5.1/search/functions_0.js new file mode 100644 index 000000000..1e1147b3e --- /dev/null +++ b/doc/v1.5.1/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_58',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_59',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_60',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_61',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_62',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_63',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_64',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_65',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.5.1/search/groups_0.js b/doc/v1.5.1/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.5.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/groups_1.js b/doc/v1.5.1/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.5.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/groups_2.js b/doc/v1.5.1/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.5.1/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.5.1/search/mag.svg b/doc/v1.5.1/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.5.1/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.5.1/search/mag_d.svg b/doc/v1.5.1/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.5.1/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.5.1/search/mag_sel.svg b/doc/v1.5.1/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.5.1/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.5.1/search/mag_seld.svg b/doc/v1.5.1/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.5.1/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.5.1/search/pages_0.js b/doc/v1.5.1/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.5.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/pages_1.js b/doc/v1.5.1/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.5.1/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/pages_2.js b/doc/v1.5.1/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.5.1/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/pages_3.js b/doc/v1.5.1/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.5.1/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.5.1/search/search.css b/doc/v1.5.1/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.5.1/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.5.1/search/search.js b/doc/v1.5.1/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.5.1/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.5.1/structxcm__addr__ip.html b/doc/v1.5.1/structxcm__addr__ip.html new file mode 100644 index 000000000..d9b082831 --- /dev/null +++ b/doc/v1.5.1/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.5.1/sync_off.png b/doc/v1.5.1/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.5.1/sync_off.png differ diff --git a/doc/v1.5.1/sync_on.png b/doc/v1.5.1/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.5.1/sync_on.png differ diff --git a/doc/v1.5.1/tab_a.png b/doc/v1.5.1/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.5.1/tab_a.png differ diff --git a/doc/v1.5.1/tab_ad.png b/doc/v1.5.1/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.5.1/tab_ad.png differ diff --git a/doc/v1.5.1/tab_b.png b/doc/v1.5.1/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.5.1/tab_b.png differ diff --git a/doc/v1.5.1/tab_bd.png b/doc/v1.5.1/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.5.1/tab_bd.png differ diff --git a/doc/v1.5.1/tab_h.png b/doc/v1.5.1/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.5.1/tab_h.png differ diff --git a/doc/v1.5.1/tab_hd.png b/doc/v1.5.1/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.5.1/tab_hd.png differ diff --git a/doc/v1.5.1/tab_s.png b/doc/v1.5.1/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.5.1/tab_s.png differ diff --git a/doc/v1.5.1/tab_sd.png b/doc/v1.5.1/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.5.1/tab_sd.png differ diff --git a/doc/v1.5.1/tabs.css b/doc/v1.5.1/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.5.1/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.5.1/topics.html b/doc/v1.5.1/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.5.1/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.5.1/xcm_8h.html b/doc/v1.5.1/xcm_8h.html new file mode 100644 index 000000000..8a343a4ad --- /dev/null +++ b/doc/v1.5.1/xcm_8h.html @@ -0,0 +1,915 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/xcm_8h_source.html b/doc/v1.5.1/xcm_8h_source.html new file mode 100644 index 000000000..cf6e2787d --- /dev/null +++ b/doc/v1.5.1/xcm_8h_source.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1240#include <errno.h>
    +
    1241#include <stdbool.h>
    +
    1242#include <sys/types.h>
    +
    1243#include <xcm_attr_map.h>
    +
    1244
    +
    1246#define XCM_NONBLOCK (1<<0)
    +
    1247
    +
    1254struct xcm_socket;
    +
    1255
    +
    1308struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1309
    +
    1331struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1332 const struct xcm_attr_map *attrs);
    +
    1333
    +
    1369struct xcm_socket *xcm_server(const char *local_addr);
    +
    1370
    +
    1386struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1387 const struct xcm_attr_map *attrs);
    +
    1388
    +
    1405int xcm_close(struct xcm_socket *socket);
    +
    1406
    +
    1426void xcm_cleanup(struct xcm_socket *socket);
    +
    1427
    +
    1446struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1447
    +
    1467struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1468 const struct xcm_attr_map *attrs);
    +
    1469
    +
    1492int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1493
    +
    1517int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1518
    +
    1521#define XCM_SO_RECEIVABLE (1<<0)
    +
    1524#define XCM_SO_SENDABLE (1<<1)
    +
    1526#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1527
    +
    1588int xcm_await(struct xcm_socket *socket, int condition);
    +
    1589
    +
    1631int xcm_fd(struct xcm_socket *socket);
    +
    1632
    +
    1677int xcm_finish(struct xcm_socket *socket);
    +
    1678
    +
    1719int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1720
    +
    1735bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1736
    +
    1753const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1754
    +
    1769const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1770
    +
    1771#include <xcm_compat.h>
    +
    1772
    +
    1773#ifdef __cplusplus
    +
    1774}
    +
    1775#endif
    +
    1776#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.5.1/xcm__addr_8h.html b/doc/v1.5.1/xcm__addr_8h.html new file mode 100644 index 000000000..c51d85c2a --- /dev/null +++ b/doc/v1.5.1/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/xcm__addr_8h_source.html b/doc/v1.5.1/xcm__addr_8h_source.html new file mode 100644 index 000000000..88d5e679a --- /dev/null +++ b/doc/v1.5.1/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.5.1/xcm__attr_8h.html b/doc/v1.5.1/xcm__attr_8h.html new file mode 100644 index 000000000..eb477d55b --- /dev/null +++ b/doc/v1.5.1/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/xcm__attr_8h_source.html b/doc/v1.5.1/xcm__attr_8h_source.html new file mode 100644 index 000000000..a6c254db9 --- /dev/null +++ b/doc/v1.5.1/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.5.1/xcm__attr__map_8h.html b/doc/v1.5.1/xcm__attr__map_8h.html new file mode 100644 index 000000000..146ca818f --- /dev/null +++ b/doc/v1.5.1/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stdint.h>
    +#include <sys/types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/xcm__attr__map_8h_source.html b/doc/v1.5.1/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..f7ac20bde --- /dev/null +++ b/doc/v1.5.1/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stdint.h>
    +
    26#include <sys/types.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.5.1/xcm__attr__types_8h.html b/doc/v1.5.1/xcm__attr__types_8h.html new file mode 100644 index 000000000..a3adcf625 --- /dev/null +++ b/doc/v1.5.1/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/xcm__attr__types_8h_source.html b/doc/v1.5.1/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..aedf24e58 --- /dev/null +++ b/doc/v1.5.1/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.5.1/xcm__compat_8h.html b/doc/v1.5.1/xcm__compat_8h.html new file mode 100644 index 000000000..d54e6e3f9 --- /dev/null +++ b/doc/v1.5.1/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/xcm__compat_8h_source.html b/doc/v1.5.1/xcm__compat_8h_source.html new file mode 100644 index 000000000..50874d3c4 --- /dev/null +++ b/doc/v1.5.1/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.5.1/xcm__version_8h.html b/doc/v1.5.1/xcm__version_8h.html new file mode 100644 index 000000000..347c70f72 --- /dev/null +++ b/doc/v1.5.1/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   5
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.5.1"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   20
     
    #define XCM_VERSION_API   "0.20"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   5
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   1
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.5.1"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   20
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.20"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.5.1/xcm__version_8h_source.html b/doc/v1.5.1/xcm__version_8h_source.html new file mode 100644 index 000000000..76eaf19f7 --- /dev/null +++ b/doc/v1.5.1/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 5
    +
    24
    +
    26#define XCM_VERSION_PATCH 1
    +
    27
    +
    29#define XCM_VERSION "1.5.1"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 20
    +
    38
    +
    40#define XCM_VERSION_API "0.20"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.6.0/annotated.html b/doc/v1.6.0/annotated.html new file mode 100644 index 000000000..23b658e61 --- /dev/null +++ b/doc/v1.6.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.6.0/bc_s.png b/doc/v1.6.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.6.0/bc_s.png differ diff --git a/doc/v1.6.0/bc_sd.png b/doc/v1.6.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.6.0/bc_sd.png differ diff --git a/doc/v1.6.0/classes.html b/doc/v1.6.0/classes.html new file mode 100644 index 000000000..4e1aa7ce4 --- /dev/null +++ b/doc/v1.6.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.6.0/closed.png b/doc/v1.6.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.6.0/closed.png differ diff --git a/doc/v1.6.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.6.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..14583e46b --- /dev/null +++ b/doc/v1.6.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.6.0/doc.svg b/doc/v1.6.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.6.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.0/docd.svg b/doc/v1.6.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.6.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.0/doxygen.css b/doc/v1.6.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.6.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.6.0/doxygen.svg b/doc/v1.6.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.6.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.6.0/dynsections.js b/doc/v1.6.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.6.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.6.0/files.html b/doc/v1.6.0/files.html new file mode 100644 index 000000000..6f2ac5f1c --- /dev/null +++ b/doc/v1.6.0/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.6.0/folderclosed.svg b/doc/v1.6.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.6.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.6.0/folderclosedd.svg b/doc/v1.6.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.6.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.6.0/folderopen.svg b/doc/v1.6.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.6.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.6.0/folderopend.svg b/doc/v1.6.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.6.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.0/functions.html b/doc/v1.6.0/functions.html new file mode 100644 index 000000000..8e0d48ffa --- /dev/null +++ b/doc/v1.6.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.6.0/functions_vars.html b/doc/v1.6.0/functions_vars.html new file mode 100644 index 000000000..b899c1496 --- /dev/null +++ b/doc/v1.6.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.6.0/globals.html b/doc/v1.6.0/globals.html new file mode 100644 index 000000000..2264fc38e --- /dev/null +++ b/doc/v1.6.0/globals.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.6.0/globals_defs.html b/doc/v1.6.0/globals_defs.html new file mode 100644 index 000000000..209c96652 --- /dev/null +++ b/doc/v1.6.0/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.0/globals_enum.html b/doc/v1.6.0/globals_enum.html new file mode 100644 index 000000000..3f377d1b5 --- /dev/null +++ b/doc/v1.6.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.0/globals_eval.html b/doc/v1.6.0/globals_eval.html new file mode 100644 index 000000000..4c00ff060 --- /dev/null +++ b/doc/v1.6.0/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.0/globals_func.html b/doc/v1.6.0/globals_func.html new file mode 100644 index 000000000..114332120 --- /dev/null +++ b/doc/v1.6.0/globals_func.html @@ -0,0 +1,148 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.6.0/globals_type.html b/doc/v1.6.0/globals_type.html new file mode 100644 index 000000000..d963c79d3 --- /dev/null +++ b/doc/v1.6.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.0/group__api__version.html b/doc/v1.6.0/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.6.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/group__lib__version.html b/doc/v1.6.0/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.6.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/index.html b/doc/v1.6.0/index.html new file mode 100644 index 000000000..49c78e522 --- /dev/null +++ b/doc/v1.6.0/index.html @@ -0,0 +1,636 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.21 [API]
    +
    +1.6.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, the IP

    + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +
    +
    + + + + diff --git a/doc/v1.6.0/inline_umlgraph_pnghtml.pu b/doc/v1.6.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.6.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.6.0/jquery.js b/doc/v1.6.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.6.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.6.0/menu.js b/doc/v1.6.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.6.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.6.0/menudata.js b/doc/v1.6.0/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.6.0/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.6.0/minus.svg b/doc/v1.6.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.6.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.6.0/minusd.svg b/doc/v1.6.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.6.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.6.0/nav_f.png b/doc/v1.6.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.6.0/nav_f.png differ diff --git a/doc/v1.6.0/nav_fd.png b/doc/v1.6.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.6.0/nav_fd.png differ diff --git a/doc/v1.6.0/nav_g.png b/doc/v1.6.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.6.0/nav_g.png differ diff --git a/doc/v1.6.0/nav_h.png b/doc/v1.6.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.6.0/nav_h.png differ diff --git a/doc/v1.6.0/nav_hd.png b/doc/v1.6.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.6.0/nav_hd.png differ diff --git a/doc/v1.6.0/nb_connect_and_send.png b/doc/v1.6.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.6.0/nb_connect_and_send.png differ diff --git a/doc/v1.6.0/nb_connect_explicit.png b/doc/v1.6.0/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.6.0/nb_connect_explicit.png differ diff --git a/doc/v1.6.0/nb_delayed_connection_refused.png b/doc/v1.6.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.6.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.6.0/nb_flush_buffers_before_close.png b/doc/v1.6.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.6.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.6.0/nb_immediate_connection_refused.png b/doc/v1.6.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.6.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.6.0/open.png b/doc/v1.6.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.6.0/open.png differ diff --git a/doc/v1.6.0/plus.svg b/doc/v1.6.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.6.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.6.0/plusd.svg b/doc/v1.6.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.6.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.6.0/search/all_0.js b/doc/v1.6.0/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.6.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_1.js b/doc/v1.6.0/search/all_1.js new file mode 100644 index 000000000..4e03413ec --- /dev/null +++ b/doc/v1.6.0/search/all_1.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_10',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_11',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_12',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_13',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_14',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_15',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_16',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_17',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_18',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_10.js b/doc/v1.6.0/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.6.0/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_11.js b/doc/v1.6.0/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/doc/v1.6.0/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_12.js b/doc/v1.6.0/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/doc/v1.6.0/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.0/search/all_13.js b/doc/v1.6.0/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.6.0/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_14.js b/doc/v1.6.0/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/doc/v1.6.0/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_15.js b/doc/v1.6.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.6.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_16.js b/doc/v1.6.0/search/all_16.js new file mode 100644 index 000000000..d9b2d4bae --- /dev/null +++ b/doc/v1.6.0/search/all_16.js @@ -0,0 +1,100 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_88',['xcm_version',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_89',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_90',['xcm_version_api',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_91',['xcm_version_api_major',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_92',['xcm_version_api_minor',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_93',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h'],['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h']]], + ['xcm_5fversion_5fminor_94',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h'],['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h']]], + ['xcm_5fversion_5fpatch_95',['xcm_version_patch',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_96',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.0/search/all_2.js b/doc/v1.6.0/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.6.0/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_3.js b/doc/v1.6.0/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/doc/v1.6.0/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.6.0/search/all_4.js b/doc/v1.6.0/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.6.0/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_5.js b/doc/v1.6.0/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.6.0/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_6.js b/doc/v1.6.0/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/doc/v1.6.0/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_7.js b/doc/v1.6.0/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.6.0/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_8.js b/doc/v1.6.0/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.6.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.6.0/search/all_9.js b/doc/v1.6.0/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.6.0/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_a.js b/doc/v1.6.0/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.6.0/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_b.js b/doc/v1.6.0/search/all_b.js new file mode 100644 index 000000000..1c14c5865 --- /dev/null +++ b/doc/v1.6.0/search/all_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_2',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['local_20addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_c.js b/doc/v1.6.0/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.6.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_d.js b/doc/v1.6.0/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.6.0/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_e.js b/doc/v1.6.0/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.6.0/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.6.0/search/all_f.js b/doc/v1.6.0/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.6.0/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.6.0/search/classes_0.js b/doc/v1.6.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.6.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/close.svg b/doc/v1.6.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.6.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.6.0/search/defines_0.js b/doc/v1.6.0/search/defines_0.js new file mode 100644 index 000000000..d981023a8 --- /dev/null +++ b/doc/v1.6.0/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_14',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_15',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_16',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_17',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_18',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_19',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_20',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.6.0/search/enums_0.js b/doc/v1.6.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.6.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.0/search/enumvalues_0.js b/doc/v1.6.0/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.6.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.0/search/files_0.js b/doc/v1.6.0/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.6.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/functions_0.js b/doc/v1.6.0/search/functions_0.js new file mode 100644 index 000000000..1e1147b3e --- /dev/null +++ b/doc/v1.6.0/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_58',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_59',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_60',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_61',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_62',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_63',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_64',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_65',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.0/search/groups_0.js b/doc/v1.6.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.6.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/groups_1.js b/doc/v1.6.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.6.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/groups_2.js b/doc/v1.6.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.6.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.6.0/search/mag.svg b/doc/v1.6.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.6.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.6.0/search/mag_d.svg b/doc/v1.6.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.6.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.6.0/search/mag_sel.svg b/doc/v1.6.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.6.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.6.0/search/mag_seld.svg b/doc/v1.6.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.6.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.6.0/search/pages_0.js b/doc/v1.6.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.6.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/pages_1.js b/doc/v1.6.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.6.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/pages_2.js b/doc/v1.6.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.6.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/pages_3.js b/doc/v1.6.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.6.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.0/search/search.css b/doc/v1.6.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.6.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.6.0/search/search.js b/doc/v1.6.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.6.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.6.0/structxcm__addr__ip.html b/doc/v1.6.0/structxcm__addr__ip.html new file mode 100644 index 000000000..43435a5d3 --- /dev/null +++ b/doc/v1.6.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.6.0/sync_off.png b/doc/v1.6.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.6.0/sync_off.png differ diff --git a/doc/v1.6.0/sync_on.png b/doc/v1.6.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.6.0/sync_on.png differ diff --git a/doc/v1.6.0/tab_a.png b/doc/v1.6.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.6.0/tab_a.png differ diff --git a/doc/v1.6.0/tab_ad.png b/doc/v1.6.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.6.0/tab_ad.png differ diff --git a/doc/v1.6.0/tab_b.png b/doc/v1.6.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.6.0/tab_b.png differ diff --git a/doc/v1.6.0/tab_bd.png b/doc/v1.6.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.6.0/tab_bd.png differ diff --git a/doc/v1.6.0/tab_h.png b/doc/v1.6.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.6.0/tab_h.png differ diff --git a/doc/v1.6.0/tab_hd.png b/doc/v1.6.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.6.0/tab_hd.png differ diff --git a/doc/v1.6.0/tab_s.png b/doc/v1.6.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.6.0/tab_s.png differ diff --git a/doc/v1.6.0/tab_sd.png b/doc/v1.6.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.6.0/tab_sd.png differ diff --git a/doc/v1.6.0/tabs.css b/doc/v1.6.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.6.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.6.0/topics.html b/doc/v1.6.0/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.6.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.6.0/xcm_8h.html b/doc/v1.6.0/xcm_8h.html new file mode 100644 index 000000000..110a98ddf --- /dev/null +++ b/doc/v1.6.0/xcm_8h.html @@ -0,0 +1,916 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/xcm_8h_source.html b/doc/v1.6.0/xcm_8h_source.html new file mode 100644 index 000000000..52d71e9d6 --- /dev/null +++ b/doc/v1.6.0/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1261#include <errno.h>
    +
    1262#include <stdbool.h>
    +
    1263#include <stddef.h>
    +
    1264#include <sys/types.h>
    +
    1265#include <xcm_attr_map.h>
    +
    1266
    +
    1268#define XCM_NONBLOCK (1<<0)
    +
    1269
    +
    1276struct xcm_socket;
    +
    1277
    +
    1330struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1331
    +
    1353struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1354 const struct xcm_attr_map *attrs);
    +
    1355
    +
    1391struct xcm_socket *xcm_server(const char *local_addr);
    +
    1392
    +
    1408struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1409 const struct xcm_attr_map *attrs);
    +
    1410
    +
    1427int xcm_close(struct xcm_socket *socket);
    +
    1428
    +
    1448void xcm_cleanup(struct xcm_socket *socket);
    +
    1449
    +
    1468struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1469
    +
    1489struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1490 const struct xcm_attr_map *attrs);
    +
    1491
    +
    1514int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1515
    +
    1539int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1540
    +
    1543#define XCM_SO_RECEIVABLE (1<<0)
    +
    1546#define XCM_SO_SENDABLE (1<<1)
    +
    1548#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1549
    +
    1610int xcm_await(struct xcm_socket *socket, int condition);
    +
    1611
    +
    1653int xcm_fd(struct xcm_socket *socket);
    +
    1654
    +
    1699int xcm_finish(struct xcm_socket *socket);
    +
    1700
    +
    1741int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1742
    +
    1757bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1758
    +
    1775const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1776
    +
    1791const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1792
    +
    1793#include <xcm_compat.h>
    +
    1794
    +
    1795#ifdef __cplusplus
    +
    1796}
    +
    1797#endif
    +
    1798#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.6.0/xcm__addr_8h.html b/doc/v1.6.0/xcm__addr_8h.html new file mode 100644 index 000000000..ef88482d3 --- /dev/null +++ b/doc/v1.6.0/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/xcm__addr_8h_source.html b/doc/v1.6.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..c44afbc83 --- /dev/null +++ b/doc/v1.6.0/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.6.0/xcm__attr_8h.html b/doc/v1.6.0/xcm__attr_8h.html new file mode 100644 index 000000000..ebdd25d34 --- /dev/null +++ b/doc/v1.6.0/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/xcm__attr_8h_source.html b/doc/v1.6.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..e077116d7 --- /dev/null +++ b/doc/v1.6.0/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.6.0/xcm__attr__map_8h.html b/doc/v1.6.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..daf58a2aa --- /dev/null +++ b/doc/v1.6.0/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/xcm__attr__map_8h_source.html b/doc/v1.6.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..2121c54a7 --- /dev/null +++ b/doc/v1.6.0/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stddef.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.6.0/xcm__attr__types_8h.html b/doc/v1.6.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..bb458e848 --- /dev/null +++ b/doc/v1.6.0/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/xcm__attr__types_8h_source.html b/doc/v1.6.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..4c8069440 --- /dev/null +++ b/doc/v1.6.0/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.6.0/xcm__compat_8h.html b/doc/v1.6.0/xcm__compat_8h.html new file mode 100644 index 000000000..f20d64fe1 --- /dev/null +++ b/doc/v1.6.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/xcm__compat_8h_source.html b/doc/v1.6.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..0c0325f34 --- /dev/null +++ b/doc/v1.6.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.6.0/xcm__version_8h.html b/doc/v1.6.0/xcm__version_8h.html new file mode 100644 index 000000000..8e9e5ce06 --- /dev/null +++ b/doc/v1.6.0/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   6
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.6.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   21
     
    #define XCM_VERSION_API   "0.21"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   6
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.6.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   21
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.21"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.0/xcm__version_8h_source.html b/doc/v1.6.0/xcm__version_8h_source.html new file mode 100644 index 000000000..b3e64c3df --- /dev/null +++ b/doc/v1.6.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 6
    +
    24
    +
    26#define XCM_VERSION_PATCH 0
    +
    27
    +
    29#define XCM_VERSION "1.6.0"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 21
    +
    38
    +
    40#define XCM_VERSION_API "0.21"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.6.1/annotated.html b/doc/v1.6.1/annotated.html new file mode 100644 index 000000000..56e31d8f4 --- /dev/null +++ b/doc/v1.6.1/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.6.1/bc_s.png b/doc/v1.6.1/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.6.1/bc_s.png differ diff --git a/doc/v1.6.1/bc_sd.png b/doc/v1.6.1/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.6.1/bc_sd.png differ diff --git a/doc/v1.6.1/classes.html b/doc/v1.6.1/classes.html new file mode 100644 index 000000000..f8e02fb09 --- /dev/null +++ b/doc/v1.6.1/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.6.1/closed.png b/doc/v1.6.1/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.6.1/closed.png differ diff --git a/doc/v1.6.1/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.6.1/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..cc429bb28 --- /dev/null +++ b/doc/v1.6.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.6.1/doc.svg b/doc/v1.6.1/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.6.1/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.1/docd.svg b/doc/v1.6.1/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.6.1/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.1/doxygen.css b/doc/v1.6.1/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.6.1/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.6.1/doxygen.svg b/doc/v1.6.1/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.6.1/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.6.1/dynsections.js b/doc/v1.6.1/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.6.1/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.6.1/files.html b/doc/v1.6.1/files.html new file mode 100644 index 000000000..3ec8901de --- /dev/null +++ b/doc/v1.6.1/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.6.1/folderclosed.svg b/doc/v1.6.1/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.6.1/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.6.1/folderclosedd.svg b/doc/v1.6.1/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.6.1/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.6.1/folderopen.svg b/doc/v1.6.1/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.6.1/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.6.1/folderopend.svg b/doc/v1.6.1/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.6.1/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.1/functions.html b/doc/v1.6.1/functions.html new file mode 100644 index 000000000..ec60255e8 --- /dev/null +++ b/doc/v1.6.1/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.6.1/functions_vars.html b/doc/v1.6.1/functions_vars.html new file mode 100644 index 000000000..77b1ebb4f --- /dev/null +++ b/doc/v1.6.1/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.6.1/globals.html b/doc/v1.6.1/globals.html new file mode 100644 index 000000000..bc03a7b03 --- /dev/null +++ b/doc/v1.6.1/globals.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.6.1/globals_defs.html b/doc/v1.6.1/globals_defs.html new file mode 100644 index 000000000..ba097d22e --- /dev/null +++ b/doc/v1.6.1/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.1/globals_enum.html b/doc/v1.6.1/globals_enum.html new file mode 100644 index 000000000..df94d04b8 --- /dev/null +++ b/doc/v1.6.1/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.1/globals_eval.html b/doc/v1.6.1/globals_eval.html new file mode 100644 index 000000000..b71954de9 --- /dev/null +++ b/doc/v1.6.1/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.1/globals_func.html b/doc/v1.6.1/globals_func.html new file mode 100644 index 000000000..f0fa0f43e --- /dev/null +++ b/doc/v1.6.1/globals_func.html @@ -0,0 +1,148 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.6.1/globals_type.html b/doc/v1.6.1/globals_type.html new file mode 100644 index 000000000..461557a2c --- /dev/null +++ b/doc/v1.6.1/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.1/group__api__version.html b/doc/v1.6.1/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.6.1/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/group__lib__version.html b/doc/v1.6.1/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.6.1/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/index.html b/doc/v1.6.1/index.html new file mode 100644 index 000000000..0d5bf1acb --- /dev/null +++ b/doc/v1.6.1/index.html @@ -0,0 +1,636 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.21 [API]
    +
    +1.6.1 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, the IP

    + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +
    +
    + + + + diff --git a/doc/v1.6.1/inline_umlgraph_pnghtml.pu b/doc/v1.6.1/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.6.1/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.6.1/jquery.js b/doc/v1.6.1/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.6.1/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.6.1/menu.js b/doc/v1.6.1/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.6.1/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.6.1/menudata.js b/doc/v1.6.1/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.6.1/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.6.1/minus.svg b/doc/v1.6.1/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.6.1/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.6.1/minusd.svg b/doc/v1.6.1/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.6.1/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.6.1/nav_f.png b/doc/v1.6.1/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.6.1/nav_f.png differ diff --git a/doc/v1.6.1/nav_fd.png b/doc/v1.6.1/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.6.1/nav_fd.png differ diff --git a/doc/v1.6.1/nav_g.png b/doc/v1.6.1/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.6.1/nav_g.png differ diff --git a/doc/v1.6.1/nav_h.png b/doc/v1.6.1/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.6.1/nav_h.png differ diff --git a/doc/v1.6.1/nav_hd.png b/doc/v1.6.1/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.6.1/nav_hd.png differ diff --git a/doc/v1.6.1/nb_connect_and_send.png b/doc/v1.6.1/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.6.1/nb_connect_and_send.png differ diff --git a/doc/v1.6.1/nb_connect_explicit.png b/doc/v1.6.1/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.6.1/nb_connect_explicit.png differ diff --git a/doc/v1.6.1/nb_delayed_connection_refused.png b/doc/v1.6.1/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.6.1/nb_delayed_connection_refused.png differ diff --git a/doc/v1.6.1/nb_flush_buffers_before_close.png b/doc/v1.6.1/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.6.1/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.6.1/nb_immediate_connection_refused.png b/doc/v1.6.1/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.6.1/nb_immediate_connection_refused.png differ diff --git a/doc/v1.6.1/open.png b/doc/v1.6.1/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.6.1/open.png differ diff --git a/doc/v1.6.1/plus.svg b/doc/v1.6.1/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.6.1/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.6.1/plusd.svg b/doc/v1.6.1/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.6.1/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.6.1/search/all_0.js b/doc/v1.6.1/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.6.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_1.js b/doc/v1.6.1/search/all_1.js new file mode 100644 index 000000000..4e03413ec --- /dev/null +++ b/doc/v1.6.1/search/all_1.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_10',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_11',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_12',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_13',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_14',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_15',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_16',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_17',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_18',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_10.js b/doc/v1.6.1/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.6.1/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_11.js b/doc/v1.6.1/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/doc/v1.6.1/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_12.js b/doc/v1.6.1/search/all_12.js new file mode 100644 index 000000000..55f402388 --- /dev/null +++ b/doc/v1.6.1/search/all_12.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['transport_7',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_8',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_9',['Transports',['../index.html#transports',1,'']]], + ['type_10',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.1/search/all_13.js b/doc/v1.6.1/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.6.1/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_14.js b/doc/v1.6.1/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/doc/v1.6.1/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_15.js b/doc/v1.6.1/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.6.1/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_16.js b/doc/v1.6.1/search/all_16.js new file mode 100644 index 000000000..d9b2d4bae --- /dev/null +++ b/doc/v1.6.1/search/all_16.js @@ -0,0 +1,100 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_88',['xcm_version',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_89',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_90',['xcm_version_api',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_91',['xcm_version_api_major',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_92',['xcm_version_api_minor',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_93',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h'],['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h']]], + ['xcm_5fversion_5fminor_94',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h'],['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h']]], + ['xcm_5fversion_5fpatch_95',['xcm_version_patch',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_96',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.1/search/all_2.js b/doc/v1.6.1/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.6.1/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_3.js b/doc/v1.6.1/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/doc/v1.6.1/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.6.1/search/all_4.js b/doc/v1.6.1/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.6.1/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_5.js b/doc/v1.6.1/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.6.1/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_6.js b/doc/v1.6.1/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/doc/v1.6.1/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_7.js b/doc/v1.6.1/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.6.1/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_8.js b/doc/v1.6.1/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.6.1/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.6.1/search/all_9.js b/doc/v1.6.1/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.6.1/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_a.js b/doc/v1.6.1/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.6.1/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_b.js b/doc/v1.6.1/search/all_b.js new file mode 100644 index 000000000..1c14c5865 --- /dev/null +++ b/doc/v1.6.1/search/all_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_2',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['local_20addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_c.js b/doc/v1.6.1/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.6.1/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_d.js b/doc/v1.6.1/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.6.1/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_e.js b/doc/v1.6.1/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.6.1/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.6.1/search/all_f.js b/doc/v1.6.1/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.6.1/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.6.1/search/classes_0.js b/doc/v1.6.1/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.6.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/close.svg b/doc/v1.6.1/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.6.1/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.6.1/search/defines_0.js b/doc/v1.6.1/search/defines_0.js new file mode 100644 index 000000000..d981023a8 --- /dev/null +++ b/doc/v1.6.1/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_14',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_15',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_16',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_17',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_18',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_19',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_20',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.6.1/search/enums_0.js b/doc/v1.6.1/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.6.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.1/search/enumvalues_0.js b/doc/v1.6.1/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.6.1/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.1/search/files_0.js b/doc/v1.6.1/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.6.1/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/functions_0.js b/doc/v1.6.1/search/functions_0.js new file mode 100644 index 000000000..1e1147b3e --- /dev/null +++ b/doc/v1.6.1/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_58',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_59',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_60',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_61',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_62',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_63',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_64',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_65',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.1/search/groups_0.js b/doc/v1.6.1/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.6.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/groups_1.js b/doc/v1.6.1/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.6.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/groups_2.js b/doc/v1.6.1/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.6.1/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.6.1/search/mag.svg b/doc/v1.6.1/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.6.1/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.6.1/search/mag_d.svg b/doc/v1.6.1/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.6.1/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.6.1/search/mag_sel.svg b/doc/v1.6.1/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.6.1/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.6.1/search/mag_seld.svg b/doc/v1.6.1/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.6.1/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.6.1/search/pages_0.js b/doc/v1.6.1/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.6.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/pages_1.js b/doc/v1.6.1/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.6.1/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/pages_2.js b/doc/v1.6.1/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.6.1/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/pages_3.js b/doc/v1.6.1/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.6.1/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.1/search/search.css b/doc/v1.6.1/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.6.1/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.6.1/search/search.js b/doc/v1.6.1/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.6.1/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.6.1/structxcm__addr__ip.html b/doc/v1.6.1/structxcm__addr__ip.html new file mode 100644 index 000000000..61465c6b0 --- /dev/null +++ b/doc/v1.6.1/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.6.1/sync_off.png b/doc/v1.6.1/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.6.1/sync_off.png differ diff --git a/doc/v1.6.1/sync_on.png b/doc/v1.6.1/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.6.1/sync_on.png differ diff --git a/doc/v1.6.1/tab_a.png b/doc/v1.6.1/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.6.1/tab_a.png differ diff --git a/doc/v1.6.1/tab_ad.png b/doc/v1.6.1/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.6.1/tab_ad.png differ diff --git a/doc/v1.6.1/tab_b.png b/doc/v1.6.1/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.6.1/tab_b.png differ diff --git a/doc/v1.6.1/tab_bd.png b/doc/v1.6.1/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.6.1/tab_bd.png differ diff --git a/doc/v1.6.1/tab_h.png b/doc/v1.6.1/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.6.1/tab_h.png differ diff --git a/doc/v1.6.1/tab_hd.png b/doc/v1.6.1/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.6.1/tab_hd.png differ diff --git a/doc/v1.6.1/tab_s.png b/doc/v1.6.1/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.6.1/tab_s.png differ diff --git a/doc/v1.6.1/tab_sd.png b/doc/v1.6.1/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.6.1/tab_sd.png differ diff --git a/doc/v1.6.1/tabs.css b/doc/v1.6.1/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.6.1/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.6.1/topics.html b/doc/v1.6.1/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.6.1/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.6.1/xcm_8h.html b/doc/v1.6.1/xcm_8h.html new file mode 100644 index 000000000..cc39b5a86 --- /dev/null +++ b/doc/v1.6.1/xcm_8h.html @@ -0,0 +1,916 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/xcm_8h_source.html b/doc/v1.6.1/xcm_8h_source.html new file mode 100644 index 000000000..13f3e6285 --- /dev/null +++ b/doc/v1.6.1/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1261#include <errno.h>
    +
    1262#include <stdbool.h>
    +
    1263#include <stddef.h>
    +
    1264#include <sys/types.h>
    +
    1265#include <xcm_attr_map.h>
    +
    1266
    +
    1268#define XCM_NONBLOCK (1<<0)
    +
    1269
    +
    1276struct xcm_socket;
    +
    1277
    +
    1330struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1331
    +
    1353struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1354 const struct xcm_attr_map *attrs);
    +
    1355
    +
    1391struct xcm_socket *xcm_server(const char *local_addr);
    +
    1392
    +
    1408struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1409 const struct xcm_attr_map *attrs);
    +
    1410
    +
    1427int xcm_close(struct xcm_socket *socket);
    +
    1428
    +
    1448void xcm_cleanup(struct xcm_socket *socket);
    +
    1449
    +
    1468struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1469
    +
    1489struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1490 const struct xcm_attr_map *attrs);
    +
    1491
    +
    1514int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1515
    +
    1539int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1540
    +
    1543#define XCM_SO_RECEIVABLE (1<<0)
    +
    1546#define XCM_SO_SENDABLE (1<<1)
    +
    1548#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1549
    +
    1610int xcm_await(struct xcm_socket *socket, int condition);
    +
    1611
    +
    1653int xcm_fd(struct xcm_socket *socket);
    +
    1654
    +
    1699int xcm_finish(struct xcm_socket *socket);
    +
    1700
    +
    1741int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1742
    +
    1757bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1758
    +
    1775const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1776
    +
    1791const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1792
    +
    1793#include <xcm_compat.h>
    +
    1794
    +
    1795#ifdef __cplusplus
    +
    1796}
    +
    1797#endif
    +
    1798#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.6.1/xcm__addr_8h.html b/doc/v1.6.1/xcm__addr_8h.html new file mode 100644 index 000000000..2b556f0e4 --- /dev/null +++ b/doc/v1.6.1/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/xcm__addr_8h_source.html b/doc/v1.6.1/xcm__addr_8h_source.html new file mode 100644 index 000000000..354235e2e --- /dev/null +++ b/doc/v1.6.1/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.6.1/xcm__attr_8h.html b/doc/v1.6.1/xcm__attr_8h.html new file mode 100644 index 000000000..82b4a81d6 --- /dev/null +++ b/doc/v1.6.1/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/xcm__attr_8h_source.html b/doc/v1.6.1/xcm__attr_8h_source.html new file mode 100644 index 000000000..9a9d620f1 --- /dev/null +++ b/doc/v1.6.1/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.6.1/xcm__attr__map_8h.html b/doc/v1.6.1/xcm__attr__map_8h.html new file mode 100644 index 000000000..f781e7802 --- /dev/null +++ b/doc/v1.6.1/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/xcm__attr__map_8h_source.html b/doc/v1.6.1/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..0ef355f46 --- /dev/null +++ b/doc/v1.6.1/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stddef.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.6.1/xcm__attr__types_8h.html b/doc/v1.6.1/xcm__attr__types_8h.html new file mode 100644 index 000000000..09d9d5e92 --- /dev/null +++ b/doc/v1.6.1/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/xcm__attr__types_8h_source.html b/doc/v1.6.1/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..6037fa565 --- /dev/null +++ b/doc/v1.6.1/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.6.1/xcm__compat_8h.html b/doc/v1.6.1/xcm__compat_8h.html new file mode 100644 index 000000000..fcbfff286 --- /dev/null +++ b/doc/v1.6.1/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/xcm__compat_8h_source.html b/doc/v1.6.1/xcm__compat_8h_source.html new file mode 100644 index 000000000..8373f2a0f --- /dev/null +++ b/doc/v1.6.1/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.6.1/xcm__version_8h.html b/doc/v1.6.1/xcm__version_8h.html new file mode 100644 index 000000000..63847107c --- /dev/null +++ b/doc/v1.6.1/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   6
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.6.1"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   21
     
    #define XCM_VERSION_API   "0.21"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   6
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   1
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.6.1"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   21
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.21"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.1/xcm__version_8h_source.html b/doc/v1.6.1/xcm__version_8h_source.html new file mode 100644 index 000000000..d2d8fa62a --- /dev/null +++ b/doc/v1.6.1/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 6
    +
    24
    +
    26#define XCM_VERSION_PATCH 1
    +
    27
    +
    29#define XCM_VERSION "1.6.1"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 21
    +
    38
    +
    40#define XCM_VERSION_API "0.21"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.6.2/annotated.html b/doc/v1.6.2/annotated.html new file mode 100644 index 000000000..8ee57567b --- /dev/null +++ b/doc/v1.6.2/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.6.2/bc_s.png b/doc/v1.6.2/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.6.2/bc_s.png differ diff --git a/doc/v1.6.2/bc_sd.png b/doc/v1.6.2/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.6.2/bc_sd.png differ diff --git a/doc/v1.6.2/classes.html b/doc/v1.6.2/classes.html new file mode 100644 index 000000000..d090d1c98 --- /dev/null +++ b/doc/v1.6.2/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.6.2/closed.png b/doc/v1.6.2/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.6.2/closed.png differ diff --git a/doc/v1.6.2/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.6.2/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..9b52c00f7 --- /dev/null +++ b/doc/v1.6.2/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.6.2/doc.svg b/doc/v1.6.2/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.6.2/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.2/docd.svg b/doc/v1.6.2/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.6.2/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.2/doxygen.css b/doc/v1.6.2/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.6.2/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.6.2/doxygen.svg b/doc/v1.6.2/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.6.2/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.6.2/dynsections.js b/doc/v1.6.2/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.6.2/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.6.2/files.html b/doc/v1.6.2/files.html new file mode 100644 index 000000000..4341e8ba5 --- /dev/null +++ b/doc/v1.6.2/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.6.2/folderclosed.svg b/doc/v1.6.2/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.6.2/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.6.2/folderclosedd.svg b/doc/v1.6.2/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.6.2/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.6.2/folderopen.svg b/doc/v1.6.2/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.6.2/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.6.2/folderopend.svg b/doc/v1.6.2/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.6.2/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.6.2/functions.html b/doc/v1.6.2/functions.html new file mode 100644 index 000000000..955aeb752 --- /dev/null +++ b/doc/v1.6.2/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.6.2/functions_vars.html b/doc/v1.6.2/functions_vars.html new file mode 100644 index 000000000..8251b4300 --- /dev/null +++ b/doc/v1.6.2/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.6.2/globals.html b/doc/v1.6.2/globals.html new file mode 100644 index 000000000..96b7e414a --- /dev/null +++ b/doc/v1.6.2/globals.html @@ -0,0 +1,176 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.6.2/globals_defs.html b/doc/v1.6.2/globals_defs.html new file mode 100644 index 000000000..629391475 --- /dev/null +++ b/doc/v1.6.2/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.2/globals_enum.html b/doc/v1.6.2/globals_enum.html new file mode 100644 index 000000000..3a0a032ab --- /dev/null +++ b/doc/v1.6.2/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.2/globals_eval.html b/doc/v1.6.2/globals_eval.html new file mode 100644 index 000000000..f8843e540 --- /dev/null +++ b/doc/v1.6.2/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.2/globals_func.html b/doc/v1.6.2/globals_func.html new file mode 100644 index 000000000..011958f30 --- /dev/null +++ b/doc/v1.6.2/globals_func.html @@ -0,0 +1,148 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.6.2/globals_type.html b/doc/v1.6.2/globals_type.html new file mode 100644 index 000000000..1bbf0b169 --- /dev/null +++ b/doc/v1.6.2/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.6.2/group__api__version.html b/doc/v1.6.2/group__api__version.html new file mode 100644 index 000000000..9249fe69d --- /dev/null +++ b/doc/v1.6.2/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   26
     
    #define XCM_VERSION_API   "0.26"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   26
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.26"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/group__lib__version.html b/doc/v1.6.2/group__lib__version.html new file mode 100644 index 000000000..5dd1f3779 --- /dev/null +++ b/doc/v1.6.2/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   11
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.11.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   11
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.11.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/index.html b/doc/v1.6.2/index.html new file mode 100644 index 000000000..113cc9318 --- /dev/null +++ b/doc/v1.6.2/index.html @@ -0,0 +1,642 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.21 [API]
    +
    +1.6.2 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some examples addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, the IP

    + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Storage

    +

    The TLS transport reads the leaf certificate and its private key from the file system, as well as a file containing all trusted CA certificates. Default paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    For the default namespace (or any other network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/doc/v1.6.2/inline_umlgraph_pnghtml.pu b/doc/v1.6.2/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.6.2/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.6.2/jquery.js b/doc/v1.6.2/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.6.2/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.6.2/menu.js b/doc/v1.6.2/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.6.2/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.6.2/menudata.js b/doc/v1.6.2/menudata.js new file mode 100644 index 000000000..6ef7052e9 --- /dev/null +++ b/doc/v1.6.2/menudata.js @@ -0,0 +1,43 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.6.2/minus.svg b/doc/v1.6.2/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.6.2/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.6.2/minusd.svg b/doc/v1.6.2/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.6.2/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.6.2/nav_f.png b/doc/v1.6.2/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.6.2/nav_f.png differ diff --git a/doc/v1.6.2/nav_fd.png b/doc/v1.6.2/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.6.2/nav_fd.png differ diff --git a/doc/v1.6.2/nav_g.png b/doc/v1.6.2/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.6.2/nav_g.png differ diff --git a/doc/v1.6.2/nav_h.png b/doc/v1.6.2/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.6.2/nav_h.png differ diff --git a/doc/v1.6.2/nav_hd.png b/doc/v1.6.2/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.6.2/nav_hd.png differ diff --git a/doc/v1.6.2/nb_connect_and_send.png b/doc/v1.6.2/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.6.2/nb_connect_and_send.png differ diff --git a/doc/v1.6.2/nb_connect_explicit.png b/doc/v1.6.2/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.6.2/nb_connect_explicit.png differ diff --git a/doc/v1.6.2/nb_delayed_connection_refused.png b/doc/v1.6.2/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.6.2/nb_delayed_connection_refused.png differ diff --git a/doc/v1.6.2/nb_flush_buffers_before_close.png b/doc/v1.6.2/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.6.2/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.6.2/nb_immediate_connection_refused.png b/doc/v1.6.2/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.6.2/nb_immediate_connection_refused.png differ diff --git a/doc/v1.6.2/open.png b/doc/v1.6.2/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.6.2/open.png differ diff --git a/doc/v1.6.2/plus.svg b/doc/v1.6.2/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.6.2/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.6.2/plusd.svg b/doc/v1.6.2/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.6.2/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.6.2/search/all_0.js b/doc/v1.6.2/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.6.2/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_1.js b/doc/v1.6.2/search/all_1.js new file mode 100644 index 000000000..4e03413ec --- /dev/null +++ b/doc/v1.6.2/search/all_1.js @@ -0,0 +1,22 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20storage_10',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['and_20receive_11',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_12',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_13',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_14',['Control API',['../index.html#ctl_api',1,'']]], + ['attribute_20inheritance_15',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_16',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_17',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_18',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_10.js b/doc/v1.6.2/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.6.2/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_11.js b/doc/v1.6.2/search/all_11.js new file mode 100644 index 000000000..45b7fd506 --- /dev/null +++ b/doc/v1.6.2/search/all_11.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['storage_11',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['streams_12',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_13',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_14',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_15',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_16',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_12.js b/doc/v1.6.2/search/all_12.js new file mode 100644 index 000000000..60179a242 --- /dev/null +++ b/doc/v1.6.2/search/all_12.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_7',['Tracing',['../index.html#tracing',1,'']]], + ['transport_8',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_9',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_10',['Transports',['../index.html#transports',1,'']]], + ['type_11',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.6.2/search/all_13.js b/doc/v1.6.2/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.6.2/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_14.js b/doc/v1.6.2/search/all_14.js new file mode 100644 index 000000000..509f46482 --- /dev/null +++ b/doc/v1.6.2/search/all_14.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_20and_20features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_15.js b/doc/v1.6.2/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.6.2/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_16.js b/doc/v1.6.2/search/all_16.js new file mode 100644 index 000000000..d9b2d4bae --- /dev/null +++ b/doc/v1.6.2/search/all_16.js @@ -0,0 +1,100 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_26',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_27',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_28',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_29',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_30',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_31',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_32',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_33',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_34',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_35',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_36',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_37',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_38',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_39',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_40',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_41',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_42',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_43',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_44',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_45',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_46',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_47',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_48',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_49',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_52',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_53',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_54',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_55',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_56',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_57',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_58',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_59',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_60',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_61',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_62',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_63',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_64',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_65',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_66',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_67',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_68',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_69',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_70',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_71',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_72',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_73',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_74',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_75',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_76',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_77',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_78',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_79',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_80',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_81',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_82',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_83',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_84',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_85',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_86',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_87',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_88',['xcm_version',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h'],['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h']]], + ['xcm_5fversion_2eh_89',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_90',['xcm_version_api',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_91',['xcm_version_api_major',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_92',['xcm_version_api_minor',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_93',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h'],['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h']]], + ['xcm_5fversion_5fminor_94',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h'],['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h']]], + ['xcm_5fversion_5fpatch_95',['xcm_version_patch',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_96',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.2/search/all_2.js b/doc/v1.6.2/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.6.2/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_3.js b/doc/v1.6.2/search/all_3.js new file mode 100644 index 000000000..013182e71 --- /dev/null +++ b/doc/v1.6.2/search/all_3.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['certificate_20and_20key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_3',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['checks_4',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_5',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_7',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_8',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_9',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_10',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_11',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_12',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_13',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_14',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_16',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_17',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_18',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_19',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_20',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.6.2/search/all_4.js b/doc/v1.6.2/search/all_4.js new file mode 100644 index 000000000..6c71a03f0 --- /dev/null +++ b/doc/v1.6.2/search/all_4.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['delayed_20connection_20refused_1',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_2',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_3',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_4',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_5.js b/doc/v1.6.2/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.6.2/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_6.js b/doc/v1.6.2/search/all_6.js new file mode 100644 index 000000000..c044be002 --- /dev/null +++ b/doc/v1.6.2/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_7.js b/doc/v1.6.2/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.6.2/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_8.js b/doc/v1.6.2/search/all_8.js new file mode 100644 index 000000000..55899d498 --- /dev/null +++ b/doc/v1.6.2/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.6.2/search/all_9.js b/doc/v1.6.2/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.6.2/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_a.js b/doc/v1.6.2/search/all_a.js new file mode 100644 index 000000000..6048b155b --- /dev/null +++ b/doc/v1.6.2/search/all_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20storage_0',['Certificate and Key Storage',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_b.js b/doc/v1.6.2/search/all_b.js new file mode 100644 index 000000000..1c14c5865 --- /dev/null +++ b/doc/v1.6.2/search/all_b.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['limitations_0',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_1',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_2',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['local_20addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_c.js b/doc/v1.6.2/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.6.2/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_d.js b/doc/v1.6.2/search/all_d.js new file mode 100644 index 000000000..692403424 --- /dev/null +++ b/doc/v1.6.2/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_e.js b/doc/v1.6.2/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.6.2/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.6.2/search/all_f.js b/doc/v1.6.2/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.6.2/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.6.2/search/classes_0.js b/doc/v1.6.2/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.6.2/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/close.svg b/doc/v1.6.2/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.6.2/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.6.2/search/defines_0.js b/doc/v1.6.2/search/defines_0.js new file mode 100644 index 000000000..d981023a8 --- /dev/null +++ b/doc/v1.6.2/search/defines_0.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_14',['XCM_VERSION',['../xcm__version_8h.html#aadb0a0ca7a39657f8b1002fffa72190a',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_15',['XCM_VERSION_API',['../xcm__version_8h.html#a9dd4982f6b09ae68d5358e3aa3826a48',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_16',['XCM_VERSION_API_MAJOR',['../xcm__version_8h.html#a256bdc3c1c2d715c7a22c1e7e36779b6',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_17',['XCM_VERSION_API_MINOR',['../xcm__version_8h.html#ae89d6ebc954db2113486bba8986effd4',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_18',['XCM_VERSION_MAJOR',['../xcm__version_8h.html#a3b511d743cca4eab2aa3536aa798a9de',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_19',['XCM_VERSION_MINOR',['../xcm__version_8h.html#af2ef9879741fa10065fa849e4a3cd7ec',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_20',['XCM_VERSION_PATCH',['../xcm__version_8h.html#abc2e99728d72a02693cda73a263c337a',1,'xcm_version.h']]] +]; diff --git a/doc/v1.6.2/search/enums_0.js b/doc/v1.6.2/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.6.2/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.2/search/enumvalues_0.js b/doc/v1.6.2/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.6.2/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.6.2/search/files_0.js b/doc/v1.6.2/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.6.2/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/functions_0.js b/doc/v1.6.2/search/functions_0.js new file mode 100644 index 000000000..1e1147b3e --- /dev/null +++ b/doc/v1.6.2/search/functions_0.js @@ -0,0 +1,69 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_19',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_20',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_21',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_22',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_23',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_24',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_25',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_26',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_27',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_28',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_29',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_30',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_31',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_32',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_33',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_34',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_35',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_36',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_37',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_38',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_39',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_40',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_41',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_42',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_43',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_44',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_45',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_46',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_47',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_48',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_49',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_50',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_51',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_52',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_53',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_54',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_55',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_56',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_57',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_58',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_59',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_60',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_61',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_62',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_63',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_64',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_65',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.6.2/search/groups_0.js b/doc/v1.6.2/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.6.2/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/groups_1.js b/doc/v1.6.2/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.6.2/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/groups_2.js b/doc/v1.6.2/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.6.2/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.6.2/search/mag.svg b/doc/v1.6.2/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.6.2/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.6.2/search/mag_d.svg b/doc/v1.6.2/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.6.2/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.6.2/search/mag_sel.svg b/doc/v1.6.2/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.6.2/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.6.2/search/mag_seld.svg b/doc/v1.6.2/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.6.2/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.6.2/search/pages_0.js b/doc/v1.6.2/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.6.2/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/pages_1.js b/doc/v1.6.2/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.6.2/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/pages_2.js b/doc/v1.6.2/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.6.2/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/pages_3.js b/doc/v1.6.2/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.6.2/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.6.2/search/search.css b/doc/v1.6.2/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.6.2/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.6.2/search/search.js b/doc/v1.6.2/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.6.2/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.6.2/structxcm__addr__ip.html b/doc/v1.6.2/structxcm__addr__ip.html new file mode 100644 index 000000000..a7323484d --- /dev/null +++ b/doc/v1.6.2/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.6.2/sync_off.png b/doc/v1.6.2/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.6.2/sync_off.png differ diff --git a/doc/v1.6.2/sync_on.png b/doc/v1.6.2/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.6.2/sync_on.png differ diff --git a/doc/v1.6.2/tab_a.png b/doc/v1.6.2/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.6.2/tab_a.png differ diff --git a/doc/v1.6.2/tab_ad.png b/doc/v1.6.2/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.6.2/tab_ad.png differ diff --git a/doc/v1.6.2/tab_b.png b/doc/v1.6.2/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.6.2/tab_b.png differ diff --git a/doc/v1.6.2/tab_bd.png b/doc/v1.6.2/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.6.2/tab_bd.png differ diff --git a/doc/v1.6.2/tab_h.png b/doc/v1.6.2/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.6.2/tab_h.png differ diff --git a/doc/v1.6.2/tab_hd.png b/doc/v1.6.2/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.6.2/tab_hd.png differ diff --git a/doc/v1.6.2/tab_s.png b/doc/v1.6.2/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.6.2/tab_s.png differ diff --git a/doc/v1.6.2/tab_sd.png b/doc/v1.6.2/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.6.2/tab_sd.png differ diff --git a/doc/v1.6.2/tabs.css b/doc/v1.6.2/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.6.2/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.6.2/topics.html b/doc/v1.6.2/topics.html new file mode 100644 index 000000000..82bf3b6bb --- /dev/null +++ b/doc/v1.6.2/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.6.2/xcm_8h.html b/doc/v1.6.2/xcm_8h.html new file mode 100644 index 000000000..356cf8966 --- /dev/null +++ b/doc/v1.6.2/xcm_8h.html @@ -0,0 +1,916 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves the XCM socket fd for a XCM socket non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Please note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set, xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/xcm_8h_source.html b/doc/v1.6.2/xcm_8h_source.html new file mode 100644 index 000000000..d4e966150 --- /dev/null +++ b/doc/v1.6.2/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1278#include <errno.h>
    +
    1279#include <stdbool.h>
    +
    1280#include <stddef.h>
    +
    1281#include <sys/types.h>
    +
    1282#include <xcm_attr_map.h>
    +
    1283
    +
    1285#define XCM_NONBLOCK (1<<0)
    +
    1286
    +
    1293struct xcm_socket;
    +
    1294
    +
    1347struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1348
    +
    1370struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1371 const struct xcm_attr_map *attrs);
    +
    1372
    +
    1408struct xcm_socket *xcm_server(const char *local_addr);
    +
    1409
    +
    1425struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1426 const struct xcm_attr_map *attrs);
    +
    1427
    +
    1444int xcm_close(struct xcm_socket *socket);
    +
    1445
    +
    1465void xcm_cleanup(struct xcm_socket *socket);
    +
    1466
    +
    1485struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1486
    +
    1506struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1507 const struct xcm_attr_map *attrs);
    +
    1508
    +
    1531int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1532
    +
    1556int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1557
    +
    1560#define XCM_SO_RECEIVABLE (1<<0)
    +
    1563#define XCM_SO_SENDABLE (1<<1)
    +
    1565#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1566
    +
    1627int xcm_await(struct xcm_socket *socket, int condition);
    +
    1628
    +
    1670int xcm_fd(struct xcm_socket *socket);
    +
    1671
    +
    1716int xcm_finish(struct xcm_socket *socket);
    +
    1717
    +
    1758int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1759
    +
    1774bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1775
    +
    1792const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1793
    +
    1808const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1809
    +
    1810#include <xcm_compat.h>
    +
    1811
    +
    1812#ifdef __cplusplus
    +
    1813}
    +
    1814#endif
    +
    1815#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.6.2/xcm__addr_8h.html b/doc/v1.6.2/xcm__addr_8h.html new file mode 100644 index 000000000..58f0d5033 --- /dev/null +++ b/doc/v1.6.2/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/xcm__addr_8h_source.html b/doc/v1.6.2/xcm__addr_8h_source.html new file mode 100644 index 000000000..e50573bfe --- /dev/null +++ b/doc/v1.6.2/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.6.2/xcm__attr_8h.html b/doc/v1.6.2/xcm__attr_8h.html new file mode 100644 index 000000000..c73aa1234 --- /dev/null +++ b/doc/v1.6.2/xcm__attr_8h.html @@ -0,0 +1,621 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/xcm__attr_8h_source.html b/doc/v1.6.2/xcm__attr_8h_source.html new file mode 100644 index 000000000..219f728db --- /dev/null +++ b/doc/v1.6.2/xcm__attr_8h_source.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    179typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    180 void *value, size_t value_len, void *cb_data);
    +
    181
    +
    195void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    196 void *cb_data);
    +
    197
    +
    198#ifdef __cplusplus
    +
    199}
    +
    200#endif
    +
    201#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:179
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.6.2/xcm__attr__map_8h.html b/doc/v1.6.2/xcm__attr__map_8h.html new file mode 100644 index 000000000..20751b2de --- /dev/null +++ b/doc/v1.6.2/xcm__attr__map_8h.html @@ -0,0 +1,812 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/xcm__attr__map_8h_source.html b/doc/v1.6.2/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..a41cae514 --- /dev/null +++ b/doc/v1.6.2/xcm__attr__map_8h_source.html @@ -0,0 +1,206 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stddef.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name,
    +
    81 bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name,
    +
    95 int64_t attr_value);
    +
    96
    +
    97
    +
    107void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    108 const char *attr_name,
    +
    109 const char *attr_value);
    +
    110
    +
    111
    +
    121void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    122 const struct xcm_attr_map *src_map);
    +
    123
    +
    124
    +
    141const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    142 const char *attr_name,
    +
    143 enum xcm_attr_type *attr_type,
    +
    144 size_t *attr_value_len);
    +
    145
    +
    146
    +
    161const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    162 const char *attr_name);
    +
    163
    +
    164
    +
    179const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    180 const char *attr_name);
    +
    181
    +
    182
    +
    197const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    198 const char *attr_name);
    +
    199
    +
    208bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    211
    +
    220void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    221
    +
    222
    +
    230size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    231
    +
    232
    +
    236typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    237 enum xcm_attr_type attr_type,
    +
    238 const void *attr_value,
    +
    239 size_t attr_value_len,
    +
    240 void *user);
    +
    241
    +
    242
    +
    255void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    256 xcm_attr_map_foreach_cb cb, void *user);
    +
    257
    +
    258
    +
    267bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    268 const struct xcm_attr_map *attr_map_b);
    +
    269
    +
    278void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    279
    +
    280#ifdef __cplusplus
    +
    281}
    +
    282#endif
    +
    283#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:236
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.6.2/xcm__attr__types_8h.html b/doc/v1.6.2/xcm__attr__types_8h.html new file mode 100644 index 000000000..6b7d82db2 --- /dev/null +++ b/doc/v1.6.2/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/xcm__attr__types_8h_source.html b/doc/v1.6.2/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..650c48097 --- /dev/null +++ b/doc/v1.6.2/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.6.2/xcm__compat_8h.html b/doc/v1.6.2/xcm__compat_8h.html new file mode 100644 index 000000000..99b629153 --- /dev/null +++ b/doc/v1.6.2/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/xcm__compat_8h_source.html b/doc/v1.6.2/xcm__compat_8h_source.html new file mode 100644 index 000000000..e619364d7 --- /dev/null +++ b/doc/v1.6.2/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.6.2/xcm__version_8h.html b/doc/v1.6.2/xcm__version_8h.html new file mode 100644 index 000000000..7fd19b487 --- /dev/null +++ b/doc/v1.6.2/xcm__version_8h.html @@ -0,0 +1,379 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   6
     
    #define XCM_VERSION_PATCH   2
     
    #define XCM_VERSION   "1.6.2"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   21
     
    #define XCM_VERSION_API   "0.21"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   6
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   2
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.6.2"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   21
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.21"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.6.2/xcm__version_8h_source.html b/doc/v1.6.2/xcm__version_8h_source.html new file mode 100644 index 000000000..38838e79a --- /dev/null +++ b/doc/v1.6.2/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_VERSION_MAJOR 1
    +
    21
    +
    23#define XCM_VERSION_MINOR 6
    +
    24
    +
    26#define XCM_VERSION_PATCH 2
    +
    27
    +
    29#define XCM_VERSION "1.6.2"
    +
    30
    +
    34#define XCM_VERSION_API_MAJOR 0
    +
    35
    +
    37#define XCM_VERSION_API_MINOR 21
    +
    38
    +
    40#define XCM_VERSION_API "0.21"
    +
    41
    +
    47unsigned int xcm_version_major(void);
    +
    48
    +
    55unsigned int xcm_version_minor(void);
    +
    56
    +
    62unsigned int xcm_version_patch(void);
    +
    63
    +
    72const char *xcm_version(void);
    +
    73
    +
    79unsigned int xcm_version_api_major(void);
    +
    80
    +
    86unsigned int xcm_version_api_minor(void);
    +
    87
    +
    96const char *xcm_version_api(void);
    +
    97
    +
    98#ifdef __cplusplus
    +
    99}
    +
    100#endif
    +
    101#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.7.0/annotated.html b/doc/v1.7.0/annotated.html new file mode 100644 index 000000000..65dfab6d2 --- /dev/null +++ b/doc/v1.7.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.7.0/bc_s.png b/doc/v1.7.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.7.0/bc_s.png differ diff --git a/doc/v1.7.0/bc_sd.png b/doc/v1.7.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.7.0/bc_sd.png differ diff --git a/doc/v1.7.0/classes.html b/doc/v1.7.0/classes.html new file mode 100644 index 000000000..cb706a59a --- /dev/null +++ b/doc/v1.7.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.7.0/closed.png b/doc/v1.7.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.7.0/closed.png differ diff --git a/doc/v1.7.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.7.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..aae31c171 --- /dev/null +++ b/doc/v1.7.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.7.0/doc.svg b/doc/v1.7.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.7.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.7.0/docd.svg b/doc/v1.7.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.7.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.7.0/doxygen.css b/doc/v1.7.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.7.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.7.0/doxygen.svg b/doc/v1.7.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.7.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.7.0/dynsections.js b/doc/v1.7.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.7.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.7.0/files.html b/doc/v1.7.0/files.html new file mode 100644 index 000000000..6540cb412 --- /dev/null +++ b/doc/v1.7.0/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.7.0/folderclosed.svg b/doc/v1.7.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.7.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.7.0/folderclosedd.svg b/doc/v1.7.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.7.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.7.0/folderopen.svg b/doc/v1.7.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.7.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.7.0/folderopend.svg b/doc/v1.7.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.7.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.7.0/functions.html b/doc/v1.7.0/functions.html new file mode 100644 index 000000000..3d639ef2c --- /dev/null +++ b/doc/v1.7.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.7.0/functions_vars.html b/doc/v1.7.0/functions_vars.html new file mode 100644 index 000000000..a51718c0a --- /dev/null +++ b/doc/v1.7.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.7.0/globals.html b/doc/v1.7.0/globals.html new file mode 100644 index 000000000..d11f7aab6 --- /dev/null +++ b/doc/v1.7.0/globals.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.7.0/globals_defs.html b/doc/v1.7.0/globals_defs.html new file mode 100644 index 000000000..3389e4fb7 --- /dev/null +++ b/doc/v1.7.0/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.7.0/globals_enum.html b/doc/v1.7.0/globals_enum.html new file mode 100644 index 000000000..d579adc48 --- /dev/null +++ b/doc/v1.7.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.7.0/globals_eval.html b/doc/v1.7.0/globals_eval.html new file mode 100644 index 000000000..1c8e069ae --- /dev/null +++ b/doc/v1.7.0/globals_eval.html @@ -0,0 +1,84 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.7.0/globals_func.html b/doc/v1.7.0/globals_func.html new file mode 100644 index 000000000..f2c1f273b --- /dev/null +++ b/doc/v1.7.0/globals_func.html @@ -0,0 +1,151 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.7.0/globals_type.html b/doc/v1.7.0/globals_type.html new file mode 100644 index 000000000..c813383ee --- /dev/null +++ b/doc/v1.7.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.7.0/group__api__version.html b/doc/v1.7.0/group__api__version.html new file mode 100644 index 000000000..3d99342b0 --- /dev/null +++ b/doc/v1.7.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   22
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.22"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/group__lib__version.html b/doc/v1.7.0/group__lib__version.html new file mode 100644 index 000000000..1ae11a15f --- /dev/null +++ b/doc/v1.7.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   7
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.7.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/index.html b/doc/v1.7.0/index.html new file mode 100644 index 000000000..d8d7619d2 --- /dev/null +++ b/doc/v1.7.0/index.html @@ -0,0 +1,658 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.22 [API]
    +
    +1.7.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, the IP

    + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.cert All Binary RW The leaf certificate to be used. For connection sockets, writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. For connection sockets, writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes.

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/doc/v1.7.0/inline_umlgraph_pnghtml.pu b/doc/v1.7.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.7.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.7.0/jquery.js b/doc/v1.7.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.7.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.7.0/menu.js b/doc/v1.7.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.7.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.7.0/menudata.js b/doc/v1.7.0/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/doc/v1.7.0/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.7.0/minus.svg b/doc/v1.7.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.7.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.7.0/minusd.svg b/doc/v1.7.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.7.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.7.0/nav_f.png b/doc/v1.7.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.7.0/nav_f.png differ diff --git a/doc/v1.7.0/nav_fd.png b/doc/v1.7.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.7.0/nav_fd.png differ diff --git a/doc/v1.7.0/nav_g.png b/doc/v1.7.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.7.0/nav_g.png differ diff --git a/doc/v1.7.0/nav_h.png b/doc/v1.7.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.7.0/nav_h.png differ diff --git a/doc/v1.7.0/nav_hd.png b/doc/v1.7.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.7.0/nav_hd.png differ diff --git a/doc/v1.7.0/nb_connect_and_send.png b/doc/v1.7.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.7.0/nb_connect_and_send.png differ diff --git a/doc/v1.7.0/nb_connect_explicit.png b/doc/v1.7.0/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.7.0/nb_connect_explicit.png differ diff --git a/doc/v1.7.0/nb_delayed_connection_refused.png b/doc/v1.7.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.7.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.7.0/nb_flush_buffers_before_close.png b/doc/v1.7.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.7.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.7.0/nb_immediate_connection_refused.png b/doc/v1.7.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.7.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.7.0/open.png b/doc/v1.7.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.7.0/open.png differ diff --git a/doc/v1.7.0/plus.svg b/doc/v1.7.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.7.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.7.0/plusd.svg b/doc/v1.7.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.7.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.7.0/search/all_0.js b/doc/v1.7.0/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.7.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_1.js b/doc/v1.7.0/search/all_1.js new file mode 100644 index 000000000..e15474fd3 --- /dev/null +++ b/doc/v1.7.0/search/all_1.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_14',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_16',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_17',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_18',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_19',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_20',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_10.js b/doc/v1.7.0/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.7.0/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_11.js b/doc/v1.7.0/search/all_11.js new file mode 100644 index 000000000..fa8516b8e --- /dev/null +++ b/doc/v1.7.0/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_12.js b/doc/v1.7.0/search/all_12.js new file mode 100644 index 000000000..60179a242 --- /dev/null +++ b/doc/v1.7.0/search/all_12.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_7',['Tracing',['../index.html#tracing',1,'']]], + ['transport_8',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_9',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_10',['Transports',['../index.html#transports',1,'']]], + ['type_11',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.7.0/search/all_13.js b/doc/v1.7.0/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.7.0/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_14.js b/doc/v1.7.0/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/doc/v1.7.0/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_15.js b/doc/v1.7.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.7.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_16.js b/doc/v1.7.0/search/all_16.js new file mode 100644 index 000000000..6807927f8 --- /dev/null +++ b/doc/v1.7.0/search/all_16.js @@ -0,0 +1,103 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_26',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_27',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_28',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_29',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_30',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_31',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_32',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_33',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_34',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_35',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_36',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_37',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_38',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_39',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_40',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_41',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_42',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_43',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_44',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_45',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_46',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_47',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_48',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_49',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_50',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_51',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_52',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_53',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_54',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_55',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_56',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_57',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_58',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_59',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_60',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_61',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_62',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_63',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_64',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_65',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_66',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_67',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_68',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_69',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_70',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_71',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_72',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_73',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_74',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_75',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_76',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_77',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_78',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_79',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_80',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_81',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_82',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_83',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_84',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_85',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_86',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_87',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_88',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_89',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_90',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_91',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_92',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_93',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_94',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_95',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_96',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_97',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_98',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_99',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.7.0/search/all_2.js b/doc/v1.7.0/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.7.0/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_3.js b/doc/v1.7.0/search/all_3.js new file mode 100644 index 000000000..a111c3bca --- /dev/null +++ b/doc/v1.7.0/search/all_3.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['checks_5',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_6',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_8',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_9',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_10',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_11',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_12',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_13',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_14',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_15',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_17',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_18',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_19',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_20',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_21',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.7.0/search/all_4.js b/doc/v1.7.0/search/all_4.js new file mode 100644 index 000000000..d7c1ce3c6 --- /dev/null +++ b/doc/v1.7.0/search/all_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_6',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_5.js b/doc/v1.7.0/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.7.0/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_6.js b/doc/v1.7.0/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/doc/v1.7.0/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/doc/v1.7.0/search/all_7.js b/doc/v1.7.0/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.7.0/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_8.js b/doc/v1.7.0/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/doc/v1.7.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.7.0/search/all_9.js b/doc/v1.7.0/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.7.0/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_a.js b/doc/v1.7.0/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/doc/v1.7.0/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_b.js b/doc/v1.7.0/search/all_b.js new file mode 100644 index 000000000..5283f5382 --- /dev/null +++ b/doc/v1.7.0/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['local_20addresses_5',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_c.js b/doc/v1.7.0/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.7.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_d.js b/doc/v1.7.0/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/doc/v1.7.0/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_e.js b/doc/v1.7.0/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.7.0/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.7.0/search/all_f.js b/doc/v1.7.0/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.7.0/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.7.0/search/classes_0.js b/doc/v1.7.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.7.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/close.svg b/doc/v1.7.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.7.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.7.0/search/defines_0.js b/doc/v1.7.0/search/defines_0.js new file mode 100644 index 000000000..b435664ff --- /dev/null +++ b/doc/v1.7.0/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.7.0/search/enums_0.js b/doc/v1.7.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.7.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.7.0/search/enumvalues_0.js b/doc/v1.7.0/search/enumvalues_0.js new file mode 100644 index 000000000..18b0b26a1 --- /dev/null +++ b/doc/v1.7.0/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_2',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_3',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.7.0/search/files_0.js b/doc/v1.7.0/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.7.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/functions_0.js b/doc/v1.7.0/search/functions_0.js new file mode 100644 index 000000000..bc7fd35ad --- /dev/null +++ b/doc/v1.7.0/search/functions_0.js @@ -0,0 +1,72 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_19',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_20',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_21',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_22',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_23',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_24',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_25',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_26',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_27',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_28',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_29',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_30',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_31',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_32',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_33',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_34',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_35',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_36',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_37',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_38',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_39',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_40',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_41',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_42',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_43',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_44',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_45',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_46',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_47',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_48',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_49',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_50',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_51',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_52',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_53',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_54',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_55',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_56',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_57',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_58',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_59',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_60',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_61',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_62',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_63',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_64',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_65',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_66',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_67',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_68',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.7.0/search/groups_0.js b/doc/v1.7.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.7.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/groups_1.js b/doc/v1.7.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.7.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/groups_2.js b/doc/v1.7.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.7.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.7.0/search/mag.svg b/doc/v1.7.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.7.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.7.0/search/mag_d.svg b/doc/v1.7.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.7.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.7.0/search/mag_sel.svg b/doc/v1.7.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.7.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.7.0/search/mag_seld.svg b/doc/v1.7.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.7.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.7.0/search/pages_0.js b/doc/v1.7.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.7.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/pages_1.js b/doc/v1.7.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.7.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/pages_2.js b/doc/v1.7.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.7.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/pages_3.js b/doc/v1.7.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.7.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.7.0/search/search.css b/doc/v1.7.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.7.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.7.0/search/search.js b/doc/v1.7.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.7.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.7.0/structxcm__addr__ip.html b/doc/v1.7.0/structxcm__addr__ip.html new file mode 100644 index 000000000..f118a3b20 --- /dev/null +++ b/doc/v1.7.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.7.0/sync_off.png b/doc/v1.7.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.7.0/sync_off.png differ diff --git a/doc/v1.7.0/sync_on.png b/doc/v1.7.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.7.0/sync_on.png differ diff --git a/doc/v1.7.0/tab_a.png b/doc/v1.7.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.7.0/tab_a.png differ diff --git a/doc/v1.7.0/tab_ad.png b/doc/v1.7.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.7.0/tab_ad.png differ diff --git a/doc/v1.7.0/tab_b.png b/doc/v1.7.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.7.0/tab_b.png differ diff --git a/doc/v1.7.0/tab_bd.png b/doc/v1.7.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.7.0/tab_bd.png differ diff --git a/doc/v1.7.0/tab_h.png b/doc/v1.7.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.7.0/tab_h.png differ diff --git a/doc/v1.7.0/tab_hd.png b/doc/v1.7.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.7.0/tab_hd.png differ diff --git a/doc/v1.7.0/tab_s.png b/doc/v1.7.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.7.0/tab_s.png differ diff --git a/doc/v1.7.0/tab_sd.png b/doc/v1.7.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.7.0/tab_sd.png differ diff --git a/doc/v1.7.0/tabs.css b/doc/v1.7.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.7.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.7.0/topics.html b/doc/v1.7.0/topics.html new file mode 100644 index 000000000..457139469 --- /dev/null +++ b/doc/v1.7.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.7.0/xcm_8h.html b/doc/v1.7.0/xcm_8h.html new file mode 100644 index 000000000..2d9ce3418 --- /dev/null +++ b/doc/v1.7.0/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves a XCM socket's file descriptor, for a XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/xcm_8h_source.html b/doc/v1.7.0/xcm_8h_source.html new file mode 100644 index 000000000..ed8e4beda --- /dev/null +++ b/doc/v1.7.0/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1304#include <errno.h>
    +
    1305#include <stdbool.h>
    +
    1306#include <stddef.h>
    +
    1307#include <sys/types.h>
    +
    1308#include <xcm_attr_map.h>
    +
    1309
    +
    1311#define XCM_NONBLOCK (1<<0)
    +
    1312
    +
    1319struct xcm_socket;
    +
    1320
    +
    1373struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1374
    +
    1396struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1397 const struct xcm_attr_map *attrs);
    +
    1398
    +
    1434struct xcm_socket *xcm_server(const char *local_addr);
    +
    1435
    +
    1451struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1452 const struct xcm_attr_map *attrs);
    +
    1453
    +
    1470int xcm_close(struct xcm_socket *socket);
    +
    1471
    +
    1491void xcm_cleanup(struct xcm_socket *socket);
    +
    1492
    +
    1511struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1512
    +
    1532struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1533 const struct xcm_attr_map *attrs);
    +
    1534
    +
    1557int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1558
    +
    1582int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1583
    +
    1586#define XCM_SO_RECEIVABLE (1<<0)
    +
    1589#define XCM_SO_SENDABLE (1<<1)
    +
    1591#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1592
    +
    1653int xcm_await(struct xcm_socket *socket, int condition);
    +
    1654
    +
    1702int xcm_fd(struct xcm_socket *socket);
    +
    1703
    +
    1749int xcm_finish(struct xcm_socket *socket);
    +
    1750
    +
    1791int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1792
    +
    1807bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1808
    +
    1825const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1826
    +
    1841const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1842
    +
    1843#include <xcm_compat.h>
    +
    1844
    +
    1845#ifdef __cplusplus
    +
    1846}
    +
    1847#endif
    +
    1848#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.7.0/xcm__addr_8h.html b/doc/v1.7.0/xcm__addr_8h.html new file mode 100644 index 000000000..a26373c87 --- /dev/null +++ b/doc/v1.7.0/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/xcm__addr_8h_source.html b/doc/v1.7.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..d121c3e57 --- /dev/null +++ b/doc/v1.7.0/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.7.0/xcm__attr_8h.html b/doc/v1.7.0/xcm__attr_8h.html new file mode 100644 index 000000000..d82fbf2d6 --- /dev/null +++ b/doc/v1.7.0/xcm__attr_8h.html @@ -0,0 +1,681 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/xcm__attr_8h_source.html b/doc/v1.7.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..ddcac8837 --- /dev/null +++ b/doc/v1.7.0/xcm__attr_8h_source.html @@ -0,0 +1,155 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    89 const char *value);
    +
    90
    +
    116int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    117 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    118
    +
    135int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    136 bool *value);
    +
    137
    +
    154int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    155 int64_t *value);
    +
    156
    +
    175int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    176 char *value, size_t capacity);
    +
    177
    +
    195int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    196 void *value, size_t capacity);
    +
    197
    +
    199typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    200 void *value, size_t value_len, void *cb_data);
    +
    201
    +
    215void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    216 void *cb_data);
    +
    217
    +
    218#ifdef __cplusplus
    +
    219}
    +
    220#endif
    +
    221#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:199
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.7.0/xcm__attr__map_8h.html b/doc/v1.7.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..0d98d3699 --- /dev/null +++ b/doc/v1.7.0/xcm__attr__map_8h.html @@ -0,0 +1,905 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/xcm__attr__map_8h_source.html b/doc/v1.7.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..23b97bb47 --- /dev/null +++ b/doc/v1.7.0/xcm__attr__map_8h_source.html @@ -0,0 +1,213 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    22#include <xcm_attr_types.h>
    +
    23
    +
    24#include <stdbool.h>
    +
    25#include <stddef.h>
    +
    26#include <stdint.h>
    +
    27
    +
    28struct xcm_attr_map;
    +
    29
    +
    30
    +
    36struct xcm_attr_map *xcm_attr_map_create(void);
    +
    37
    +
    38
    +
    46struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    47
    +
    65void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    66 enum xcm_attr_type attr_type, const void *attr_value,
    +
    67 size_t attr_value_len);
    +
    68
    +
    69
    +
    79void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    80 const char *attr_name, bool attr_value);
    +
    81
    +
    82
    +
    92void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    93 const char *attr_name, int64_t attr_value);
    +
    94
    +
    95
    +
    105void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    106 const char *attr_name, const char *attr_value);
    +
    107
    +
    108
    +
    118void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    119 const char *attr_name, const void *attr_value,
    +
    120 size_t attr_value_len);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    133 const struct xcm_attr_map *src_map);
    +
    134
    +
    135
    +
    152const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    153 const char *attr_name,
    +
    154 enum xcm_attr_type *attr_type,
    +
    155 size_t *attr_value_len);
    +
    156
    +
    157
    +
    172const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    173 const char *attr_name);
    +
    174
    +
    175
    +
    190const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    191 const char *attr_name);
    +
    192
    +
    193
    +
    208const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    209 const char *attr_name);
    +
    210
    +
    225const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    226 const char *attr_name);
    +
    227
    +
    236bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    237 const char *attr_name);
    +
    238
    +
    239
    +
    248void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    249
    +
    250
    +
    258size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    259
    +
    260
    +
    264typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    265 enum xcm_attr_type attr_type,
    +
    266 const void *attr_value,
    +
    267 size_t attr_value_len,
    +
    268 void *user);
    +
    269
    +
    270
    +
    283void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    284 xcm_attr_map_foreach_cb cb, void *user);
    +
    285
    +
    286
    +
    295bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    296 const struct xcm_attr_map *attr_map_b);
    +
    297
    +
    306void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    307
    +
    308#ifdef __cplusplus
    +
    309}
    +
    310#endif
    +
    311#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:264
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.7.0/xcm__attr__types_8h.html b/doc/v1.7.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..3dcd9aee9 --- /dev/null +++ b/doc/v1.7.0/xcm__attr__types_8h.html @@ -0,0 +1,130 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type { xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/xcm__attr__types_8h_source.html b/doc/v1.7.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..7743ab163 --- /dev/null +++ b/doc/v1.7.0/xcm__attr__types_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    29
    +
    30#ifdef __cplusplus
    +
    31}
    +
    32#endif
    +
    33#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.7.0/xcm__compat_8h.html b/doc/v1.7.0/xcm__compat_8h.html new file mode 100644 index 000000000..c02ccb0c3 --- /dev/null +++ b/doc/v1.7.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/xcm__compat_8h_source.html b/doc/v1.7.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..286fba2ad --- /dev/null +++ b/doc/v1.7.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.7.0/xcm__version_8h.html b/doc/v1.7.0/xcm__version_8h.html new file mode 100644 index 000000000..2cf8db842 --- /dev/null +++ b/doc/v1.7.0/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   7
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.7.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   22
     
    #define XCM_VERSION_API   "0.22"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.7.0/xcm__version_8h_source.html b/doc/v1.7.0/xcm__version_8h_source.html new file mode 100644 index 000000000..7f3f21dbd --- /dev/null +++ b/doc/v1.7.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 7
    +
    29
    +
    31#define XCM_VERSION_PATCH 0
    +
    32
    +
    34#define XCM_VERSION "1.7.0"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 22
    +
    48
    +
    50#define XCM_VERSION_API "0.22"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.8.0/annotated.html b/doc/v1.8.0/annotated.html new file mode 100644 index 000000000..e38885071 --- /dev/null +++ b/doc/v1.8.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.8.0/bc_s.png b/doc/v1.8.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.8.0/bc_s.png differ diff --git a/doc/v1.8.0/bc_sd.png b/doc/v1.8.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.8.0/bc_sd.png differ diff --git a/doc/v1.8.0/classes.html b/doc/v1.8.0/classes.html new file mode 100644 index 000000000..6b16b96e8 --- /dev/null +++ b/doc/v1.8.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.8.0/closed.png b/doc/v1.8.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.8.0/closed.png differ diff --git a/doc/v1.8.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.8.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..f38a9c7d9 --- /dev/null +++ b/doc/v1.8.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.8.0/doc.svg b/doc/v1.8.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.8.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.8.0/docd.svg b/doc/v1.8.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.8.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.8.0/doxygen.css b/doc/v1.8.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.8.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.8.0/doxygen.svg b/doc/v1.8.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.8.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.8.0/dynsections.js b/doc/v1.8.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.8.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.8.0/files.html b/doc/v1.8.0/files.html new file mode 100644 index 000000000..c6846e206 --- /dev/null +++ b/doc/v1.8.0/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.8.0/folderclosed.svg b/doc/v1.8.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.8.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.8.0/folderclosedd.svg b/doc/v1.8.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.8.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.8.0/folderopen.svg b/doc/v1.8.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.8.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.8.0/folderopend.svg b/doc/v1.8.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.8.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.8.0/functions.html b/doc/v1.8.0/functions.html new file mode 100644 index 000000000..7cd88dfd3 --- /dev/null +++ b/doc/v1.8.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.8.0/functions_vars.html b/doc/v1.8.0/functions_vars.html new file mode 100644 index 000000000..e5e29ba21 --- /dev/null +++ b/doc/v1.8.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.8.0/globals.html b/doc/v1.8.0/globals.html new file mode 100644 index 000000000..82743ffaa --- /dev/null +++ b/doc/v1.8.0/globals.html @@ -0,0 +1,184 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.8.0/globals_defs.html b/doc/v1.8.0/globals_defs.html new file mode 100644 index 000000000..ece24c16b --- /dev/null +++ b/doc/v1.8.0/globals_defs.html @@ -0,0 +1,101 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.8.0/globals_enum.html b/doc/v1.8.0/globals_enum.html new file mode 100644 index 000000000..2b44c3bf3 --- /dev/null +++ b/doc/v1.8.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.8.0/globals_eval.html b/doc/v1.8.0/globals_eval.html new file mode 100644 index 000000000..39ca02994 --- /dev/null +++ b/doc/v1.8.0/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.8.0/globals_func.html b/doc/v1.8.0/globals_func.html new file mode 100644 index 000000000..d76335dd2 --- /dev/null +++ b/doc/v1.8.0/globals_func.html @@ -0,0 +1,155 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.8.0/globals_type.html b/doc/v1.8.0/globals_type.html new file mode 100644 index 000000000..9919596b3 --- /dev/null +++ b/doc/v1.8.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.8.0/group__api__version.html b/doc/v1.8.0/group__api__version.html new file mode 100644 index 000000000..8421e15a3 --- /dev/null +++ b/doc/v1.8.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   23
     
    #define XCM_VERSION_API   "0.23"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   23
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.23"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/group__lib__version.html b/doc/v1.8.0/group__lib__version.html new file mode 100644 index 000000000..627b2d781 --- /dev/null +++ b/doc/v1.8.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   8
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.8.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   8
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.8.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/index.html b/doc/v1.8.0/index.html new file mode 100644 index 000000000..3c7dc2de3 --- /dev/null +++ b/doc/v1.8.0/index.html @@ -0,0 +1,660 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.23 [API]
    +
    +1.8.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP transport-specific attributes, see TCP Socket Attributes, and for TLS, see TLS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    Unlike BSD sockets, a XCM socket may not be shared among different threads without synchronization external to XCM. With proper external serialization, a socket may be shared by different threads in the same process, although it might provide difficult in practice since a thread in a blocking XCM function will continue to hold the lock, and thus preventing other threads from accessing the socket at all.

    +

    For non-blocking sockets, threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    The read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    dns.timeout Connection Double RW The number of seconds until DNS times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query/response transaction to a particular transaction). Only available when the library is built with the c-ares DNS resolver.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem", the private key in "key.pem" and the trusted CA certificates in "tc.pem".

    +

    In case the certificate, key or trusted CAs files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. For connection sockets, writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. For connection sockets, writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.cert All Binary RW The leaf certificate to be used. For connection sockets, writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. For connection sockets, writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. For connection sockets, writable only at socket creation. May not be set if authentication is disabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. For connection sockets, writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. For connection sockets, writable only at socket creation. Default value is true.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. For connection sockets, writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. For connection sockets, writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. For connection sockets, writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or the TLS authenication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the TCP Socket Attributes (including the IP and DNS-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTLS Transport

    +

    The BTLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated byte stream service over TCP.

    +

    Unlike the TLS Transport, BTLS doesn't have a framing header or anything else on the wire protocol level that is specific to XCM. It's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/doc/v1.8.0/inline_umlgraph_pnghtml.pu b/doc/v1.8.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.8.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.8.0/jquery.js b/doc/v1.8.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.8.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.8.0/menu.js b/doc/v1.8.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.8.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.8.0/menudata.js b/doc/v1.8.0/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/doc/v1.8.0/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.8.0/minus.svg b/doc/v1.8.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.8.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.8.0/minusd.svg b/doc/v1.8.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.8.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.8.0/nav_f.png b/doc/v1.8.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.8.0/nav_f.png differ diff --git a/doc/v1.8.0/nav_fd.png b/doc/v1.8.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.8.0/nav_fd.png differ diff --git a/doc/v1.8.0/nav_g.png b/doc/v1.8.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.8.0/nav_g.png differ diff --git a/doc/v1.8.0/nav_h.png b/doc/v1.8.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.8.0/nav_h.png differ diff --git a/doc/v1.8.0/nav_hd.png b/doc/v1.8.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.8.0/nav_hd.png differ diff --git a/doc/v1.8.0/nb_connect_and_send.png b/doc/v1.8.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.8.0/nb_connect_and_send.png differ diff --git a/doc/v1.8.0/nb_connect_explicit.png b/doc/v1.8.0/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.8.0/nb_connect_explicit.png differ diff --git a/doc/v1.8.0/nb_delayed_connection_refused.png b/doc/v1.8.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.8.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.8.0/nb_flush_buffers_before_close.png b/doc/v1.8.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.8.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.8.0/nb_immediate_connection_refused.png b/doc/v1.8.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.8.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.8.0/open.png b/doc/v1.8.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.8.0/open.png differ diff --git a/doc/v1.8.0/plus.svg b/doc/v1.8.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.8.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.8.0/plusd.svg b/doc/v1.8.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.8.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.8.0/search/all_0.js b/doc/v1.8.0/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.8.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_1.js b/doc/v1.8.0/search/all_1.js new file mode 100644 index 000000000..e15474fd3 --- /dev/null +++ b/doc/v1.8.0/search/all_1.js @@ -0,0 +1,24 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20transport_20selection_14',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_15',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_16',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_17',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_18',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_19',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_20',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_10.js b/doc/v1.8.0/search/all_10.js new file mode 100644 index 000000000..927fac9a6 --- /dev/null +++ b/doc/v1.8.0/search/all_10.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['role_20configuration_4',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_5',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_11.js b/doc/v1.8.0/search/all_11.js new file mode 100644 index 000000000..fa8516b8e --- /dev/null +++ b/doc/v1.8.0/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_12.js b/doc/v1.8.0/search/all_12.js new file mode 100644 index 000000000..60179a242 --- /dev/null +++ b/doc/v1.8.0/search/all_12.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20socket_20attributes_1',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_2',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_3',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_4',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_5',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_6',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_7',['Tracing',['../index.html#tracing',1,'']]], + ['transport_8',['transport',['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_9',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_10',['Transports',['../index.html#transports',1,'']]], + ['type_11',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.8.0/search/all_13.js b/doc/v1.8.0/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.8.0/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_14.js b/doc/v1.8.0/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/doc/v1.8.0/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_15.js b/doc/v1.8.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.8.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_16.js b/doc/v1.8.0/search/all_16.js new file mode 100644 index 000000000..45795237f --- /dev/null +++ b/doc/v1.8.0/search/all_16.js @@ -0,0 +1,108 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtls_7',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_8',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_9',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_10',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_11',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_12',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_13',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_14',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_15',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_16',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_17',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_18',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_19',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_20',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_21',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_22',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_23',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_24',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_25',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_26',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_27',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_28',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_29',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_30',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_31',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_32',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_33',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_34',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_35',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_36',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_37',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_38',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_39',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_40',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_41',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_42',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_43',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_44',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_45',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_46',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_47',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_48',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_49',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_50',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_51',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_52',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_53',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_54',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_55',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_56',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_57',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_58',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_59',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_60',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_61',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_62',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_63',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_64',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_65',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_66',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtls_5fproto_67',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_68',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_69',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_70',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_71',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_72',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_73',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_74',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_75',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_76',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_77',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_78',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_79',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_80',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_81',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_82',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_83',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_84',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_85',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_86',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_87',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_88',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_89',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_90',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_91',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_92',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_93',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_94',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_95',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_96',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_97',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_98',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_99',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_100',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_101',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_102',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_103',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_104',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.8.0/search/all_2.js b/doc/v1.8.0/search/all_2.js new file mode 100644 index 000000000..886108d1e --- /dev/null +++ b/doc/v1.8.0/search/all_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btls_20transport_5',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_6',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_7',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_8',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_3.js b/doc/v1.8.0/search/all_3.js new file mode 100644 index 000000000..a111c3bca --- /dev/null +++ b/doc/v1.8.0/search/all_3.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['checks_5',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['ciphers_6',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_8',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_9',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_10',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_11',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_12',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['connection_20oriented_20messaging_13',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_14',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_15',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_17',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_18',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_19',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_20',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_21',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.8.0/search/all_4.js b/doc/v1.8.0/search/all_4.js new file mode 100644 index 000000000..d7c1ce3c6 --- /dev/null +++ b/doc/v1.8.0/search/all_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['driven_20programming_20support_6',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_5.js b/doc/v1.8.0/search/all_5.js new file mode 100644 index 000000000..651806ccd --- /dev/null +++ b/doc/v1.8.0/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_6.js b/doc/v1.8.0/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/doc/v1.8.0/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/doc/v1.8.0/search/all_7.js b/doc/v1.8.0/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.8.0/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_8.js b/doc/v1.8.0/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/doc/v1.8.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.8.0/search/all_9.js b/doc/v1.8.0/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.8.0/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_a.js b/doc/v1.8.0/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/doc/v1.8.0/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_b.js b/doc/v1.8.0/search/all_b.js new file mode 100644 index 000000000..5283f5382 --- /dev/null +++ b/doc/v1.8.0/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['local_20addresses_5',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_c.js b/doc/v1.8.0/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.8.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_d.js b/doc/v1.8.0/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/doc/v1.8.0/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_e.js b/doc/v1.8.0/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.8.0/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.8.0/search/all_f.js b/doc/v1.8.0/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.8.0/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.8.0/search/classes_0.js b/doc/v1.8.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.8.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/close.svg b/doc/v1.8.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.8.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.8.0/search/defines_0.js b/doc/v1.8.0/search/defines_0.js new file mode 100644 index 000000000..b435664ff --- /dev/null +++ b/doc/v1.8.0/search/defines_0.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['xcm_5fbtls_5fproto_0',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_1',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_2',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_3',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_4',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_5',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_6',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_7',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_8',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_9',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_10',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_11',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_12',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_13',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.8.0/search/enums_0.js b/doc/v1.8.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.8.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.8.0/search/enumvalues_0.js b/doc/v1.8.0/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/doc/v1.8.0/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.8.0/search/files_0.js b/doc/v1.8.0/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.8.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/functions_0.js b/doc/v1.8.0/search/functions_0.js new file mode 100644 index 000000000..dc40e996b --- /dev/null +++ b/doc/v1.8.0/search/functions_0.js @@ -0,0 +1,76 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtls_2',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_3',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_4',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_5',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_6',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_7',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_8',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_9',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_10',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_11',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_12',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_13',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_14',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_15',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_16',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_17',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_18',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_19',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_20',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_21',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_22',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_23',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_24',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_25',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_26',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_27',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_28',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_29',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_30',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_31',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_32',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_33',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_34',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_35',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_36',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_37',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_38',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_39',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_40',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_41',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_42',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_43',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_44',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_45',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_46',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_47',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_48',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_49',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_50',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_51',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_52',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_53',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_54',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_55',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_56',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_57',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_58',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_59',['xcm_receive',['../xcm_8h.html#a01b290a1b9e5a806c955322883481d29',1,'xcm.h']]], + ['xcm_5fremote_5faddr_60',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_61',['xcm_send',['../xcm_8h.html#ac1a888c879430f4fd51ccf43d6cec344',1,'xcm.h']]], + ['xcm_5fserver_62',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_63',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_64',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_65',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_66',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_67',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_68',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_69',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_70',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_71',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_72',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.8.0/search/groups_0.js b/doc/v1.8.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.8.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/groups_1.js b/doc/v1.8.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.8.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/groups_2.js b/doc/v1.8.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.8.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.8.0/search/mag.svg b/doc/v1.8.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.8.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.8.0/search/mag_d.svg b/doc/v1.8.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.8.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.8.0/search/mag_sel.svg b/doc/v1.8.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.8.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.8.0/search/mag_seld.svg b/doc/v1.8.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.8.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.8.0/search/pages_0.js b/doc/v1.8.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.8.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/pages_1.js b/doc/v1.8.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.8.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/pages_2.js b/doc/v1.8.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.8.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/pages_3.js b/doc/v1.8.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.8.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.8.0/search/search.css b/doc/v1.8.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.8.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.8.0/search/search.js b/doc/v1.8.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.8.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.8.0/structxcm__addr__ip.html b/doc/v1.8.0/structxcm__addr__ip.html new file mode 100644 index 000000000..6ee32576f --- /dev/null +++ b/doc/v1.8.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.8.0/sync_off.png b/doc/v1.8.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.8.0/sync_off.png differ diff --git a/doc/v1.8.0/sync_on.png b/doc/v1.8.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.8.0/sync_on.png differ diff --git a/doc/v1.8.0/tab_a.png b/doc/v1.8.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.8.0/tab_a.png differ diff --git a/doc/v1.8.0/tab_ad.png b/doc/v1.8.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.8.0/tab_ad.png differ diff --git a/doc/v1.8.0/tab_b.png b/doc/v1.8.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.8.0/tab_b.png differ diff --git a/doc/v1.8.0/tab_bd.png b/doc/v1.8.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.8.0/tab_bd.png differ diff --git a/doc/v1.8.0/tab_h.png b/doc/v1.8.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.8.0/tab_h.png differ diff --git a/doc/v1.8.0/tab_hd.png b/doc/v1.8.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.8.0/tab_hd.png differ diff --git a/doc/v1.8.0/tab_s.png b/doc/v1.8.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.8.0/tab_s.png differ diff --git a/doc/v1.8.0/tab_sd.png b/doc/v1.8.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.8.0/tab_sd.png differ diff --git a/doc/v1.8.0/tabs.css b/doc/v1.8.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.8.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.8.0/topics.html b/doc/v1.8.0/topics.html new file mode 100644 index 000000000..8fa2f7a10 --- /dev/null +++ b/doc/v1.8.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.8.0/xcm_8h.html b/doc/v1.8.0/xcm_8h.html new file mode 100644 index 000000000..5c57b33fc --- /dev/null +++ b/doc/v1.8.0/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *conn_socket, const void *buf, size_t len)
     
    int xcm_receive (struct xcm_socket *conn_socket, void *buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket * conn_socket,
    const void * buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket * conn_socket,
    void * buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns the XCM socket fd on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves a XCM socket's file descriptor, for a XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns the true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/xcm_8h_source.html b/doc/v1.8.0/xcm_8h_source.html new file mode 100644 index 000000000..520f495c2 --- /dev/null +++ b/doc/v1.8.0/xcm_8h_source.html @@ -0,0 +1,177 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1306#include <errno.h>
    +
    1307#include <stdbool.h>
    +
    1308#include <stddef.h>
    +
    1309#include <sys/types.h>
    +
    1310#include <xcm_attr_map.h>
    +
    1311
    +
    1313#define XCM_NONBLOCK (1<<0)
    +
    1314
    +
    1321struct xcm_socket;
    +
    1322
    +
    1375struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1376
    +
    1398struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1399 const struct xcm_attr_map *attrs);
    +
    1400
    +
    1436struct xcm_socket *xcm_server(const char *local_addr);
    +
    1437
    +
    1453struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1454 const struct xcm_attr_map *attrs);
    +
    1455
    +
    1472int xcm_close(struct xcm_socket *socket);
    +
    1473
    +
    1493void xcm_cleanup(struct xcm_socket *socket);
    +
    1494
    +
    1513struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1514
    +
    1534struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1535 const struct xcm_attr_map *attrs);
    +
    1536
    +
    1559int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len);
    +
    1560
    +
    1584int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity);
    +
    1585
    +
    1588#define XCM_SO_RECEIVABLE (1<<0)
    +
    1591#define XCM_SO_SENDABLE (1<<1)
    +
    1593#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1594
    +
    1655int xcm_await(struct xcm_socket *socket, int condition);
    +
    1656
    +
    1704int xcm_fd(struct xcm_socket *socket);
    +
    1705
    +
    1751int xcm_finish(struct xcm_socket *socket);
    +
    1752
    +
    1793int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1794
    +
    1809bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1810
    +
    1827const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1828
    +
    1843const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1844
    +
    1845#include <xcm_compat.h>
    +
    1846
    +
    1847#ifdef __cplusplus
    +
    1848}
    +
    1849#endif
    +
    1850#endif
    +
    int xcm_receive(struct xcm_socket *conn_socket, void *buf, size_t capacity)
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    int xcm_send(struct xcm_socket *conn_socket, const void *buf, size_t len)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.8.0/xcm__addr_8h.html b/doc/v1.8.0/xcm__addr_8h.html new file mode 100644 index 000000000..80918694f --- /dev/null +++ b/doc/v1.8.0/xcm__addr_8h.html @@ -0,0 +1,1077 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/xcm__addr_8h_source.html b/doc/v1.8.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..677d4f5bc --- /dev/null +++ b/doc/v1.8.0/xcm__addr_8h_source.html @@ -0,0 +1,215 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    43
    +
    44enum xcm_addr_type {
    +
    45 xcm_addr_type_name,
    +
    46 xcm_addr_type_ip
    +
    47};
    +
    48
    +
    + +
    51{
    +
    53 sa_family_t family;
    +
    54
    +
    56 union {
    +
    59 in_addr_t ip4;
    +
    62 uint8_t ip6[16];
    + +
    64};
    +
    +
    65
    +
    + +
    68{
    +
    70 enum xcm_addr_type type;
    +
    71
    +
    73 union {
    +
    74 struct xcm_addr_ip ip;
    +
    75 /* Max DNS name length is 253 characters */
    +
    76 char name[254];
    +
    77 };
    +
    78};
    +
    +
    79
    +
    93int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    94
    +
    108int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    109 uint16_t *port);
    +
    110
    +
    124int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    125 uint16_t *port);
    +
    126
    +
    141int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    142 uint16_t *port);
    +
    143
    +
    158int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    159 uint16_t *port);
    +
    160
    +
    174int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    175
    +
    189int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    190 size_t capacity);
    +
    191
    +
    205int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    206 uint16_t *port);
    +
    207
    +
    223int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    224 char *utls_addr_s, size_t capacity);
    +
    225
    +
    241int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *tls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tcp_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *sctp_addr_s, size_t capacity);
    +
    279
    +
    294int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    295
    +
    310int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    311
    +
    327int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    328 char *btls_addr_s, size_t capacity);
    +
    329
    +
    330#include <xcm_addr_compat.h>
    +
    331
    +
    332#ifdef __cplusplus
    +
    333}
    +
    334#endif
    +
    335#endif
    +
    Definition xcm_addr.h:68
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:70
    +
    Definition xcm_addr.h:51
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:53
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:62
    +
    in_addr_t ip4
    Definition xcm_addr.h:59
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.8.0/xcm__attr_8h.html b/doc/v1.8.0/xcm__attr_8h.html new file mode 100644 index 000000000..43b10106a --- /dev/null +++ b/doc/v1.8.0/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/xcm__attr_8h_source.html b/doc/v1.8.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..dff9da2af --- /dev/null +++ b/doc/v1.8.0/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.8.0/xcm__attr__map_8h.html b/doc/v1.8.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..766216f7f --- /dev/null +++ b/doc/v1.8.0/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/xcm__attr__map_8h_source.html b/doc/v1.8.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..85309efd4 --- /dev/null +++ b/doc/v1.8.0/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.8.0/xcm__attr__types_8h.html b/doc/v1.8.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..9597ffcd2 --- /dev/null +++ b/doc/v1.8.0/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/xcm__attr__types_8h_source.html b/doc/v1.8.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..c2bd4fe89 --- /dev/null +++ b/doc/v1.8.0/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.8.0/xcm__compat_8h.html b/doc/v1.8.0/xcm__compat_8h.html new file mode 100644 index 000000000..5b8ff1918 --- /dev/null +++ b/doc/v1.8.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/xcm__compat_8h_source.html b/doc/v1.8.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..d6d8ace2c --- /dev/null +++ b/doc/v1.8.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.8.0/xcm__version_8h.html b/doc/v1.8.0/xcm__version_8h.html new file mode 100644 index 000000000..3e7ac849a --- /dev/null +++ b/doc/v1.8.0/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   8
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.8.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   23
     
    #define XCM_VERSION_API   "0.23"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.8.0/xcm__version_8h_source.html b/doc/v1.8.0/xcm__version_8h_source.html new file mode 100644 index 000000000..8a4261a06 --- /dev/null +++ b/doc/v1.8.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 8
    +
    29
    +
    31#define XCM_VERSION_PATCH 0
    +
    32
    +
    34#define XCM_VERSION "1.8.0"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 23
    +
    48
    +
    50#define XCM_VERSION_API "0.23"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.9.0/annotated.html b/doc/v1.9.0/annotated.html new file mode 100644 index 000000000..0bddb19d1 --- /dev/null +++ b/doc/v1.9.0/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.9.0/bc_s.png b/doc/v1.9.0/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.9.0/bc_s.png differ diff --git a/doc/v1.9.0/bc_sd.png b/doc/v1.9.0/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.9.0/bc_sd.png differ diff --git a/doc/v1.9.0/classes.html b/doc/v1.9.0/classes.html new file mode 100644 index 000000000..5f0ed3469 --- /dev/null +++ b/doc/v1.9.0/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.9.0/closed.png b/doc/v1.9.0/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.9.0/closed.png differ diff --git a/doc/v1.9.0/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.9.0/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..8539ab1d1 --- /dev/null +++ b/doc/v1.9.0/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.9.0/doc.svg b/doc/v1.9.0/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.9.0/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.0/docd.svg b/doc/v1.9.0/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.9.0/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.0/doxygen.css b/doc/v1.9.0/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.9.0/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.9.0/doxygen.svg b/doc/v1.9.0/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.9.0/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.9.0/dynsections.js b/doc/v1.9.0/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.9.0/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.9.0/files.html b/doc/v1.9.0/files.html new file mode 100644 index 000000000..bc9efab45 --- /dev/null +++ b/doc/v1.9.0/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.9.0/folderclosed.svg b/doc/v1.9.0/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.9.0/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.9.0/folderclosedd.svg b/doc/v1.9.0/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.9.0/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.9.0/folderopen.svg b/doc/v1.9.0/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.9.0/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.9.0/folderopend.svg b/doc/v1.9.0/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.9.0/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.0/functions.html b/doc/v1.9.0/functions.html new file mode 100644 index 000000000..c1f8814c1 --- /dev/null +++ b/doc/v1.9.0/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.9.0/functions_vars.html b/doc/v1.9.0/functions_vars.html new file mode 100644 index 000000000..3ad9e4d10 --- /dev/null +++ b/doc/v1.9.0/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.9.0/globals.html b/doc/v1.9.0/globals.html new file mode 100644 index 000000000..ca46d2351 --- /dev/null +++ b/doc/v1.9.0/globals.html @@ -0,0 +1,187 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.9.0/globals_defs.html b/doc/v1.9.0/globals_defs.html new file mode 100644 index 000000000..d1534c540 --- /dev/null +++ b/doc/v1.9.0/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.0/globals_enum.html b/doc/v1.9.0/globals_enum.html new file mode 100644 index 000000000..f30b04925 --- /dev/null +++ b/doc/v1.9.0/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.0/globals_eval.html b/doc/v1.9.0/globals_eval.html new file mode 100644 index 000000000..dc4678ebe --- /dev/null +++ b/doc/v1.9.0/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.0/globals_func.html b/doc/v1.9.0/globals_func.html new file mode 100644 index 000000000..e31e92a31 --- /dev/null +++ b/doc/v1.9.0/globals_func.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.9.0/globals_type.html b/doc/v1.9.0/globals_type.html new file mode 100644 index 000000000..be64b4b02 --- /dev/null +++ b/doc/v1.9.0/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.0/group__api__version.html b/doc/v1.9.0/group__api__version.html new file mode 100644 index 000000000..ac218ae77 --- /dev/null +++ b/doc/v1.9.0/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   24
     
    #define XCM_VERSION_API   "0.24"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   24
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.24"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/group__lib__version.html b/doc/v1.9.0/group__lib__version.html new file mode 100644 index 000000000..a910b492a --- /dev/null +++ b/doc/v1.9.0/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   9
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.9.0"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   9
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   0
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.9.0"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/index.html b/doc/v1.9.0/index.html new file mode 100644 index 000000000..6a82384e1 --- /dev/null +++ b/doc/v1.9.0/index.html @@ -0,0 +1,712 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.24 [API]
    +
    +1.9.0 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is an inter-process communication API and an implementation of this C API in the form a shared library. For certain transports, XCM may also be used to denote a tiny bit of wire protocol, providing framing over byte stream transport protocols.

    +

    The primary component of the XCM library is a set of inter-process communication transports - all hosted under the same API. A XCM transport provides a connection-oriented, reliable service, with in-order delivery. There are two types of transports; one providing a messaging service and another providing a byte stream.

    +

    The XCM API allows a straight-forward mapping to TLS, TCP and SCTP for remote communcation, as well as more efficient inter-process commmunication (IPC) mechanisms for local communication.

    +

    This document focuses on the API, but also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Socket API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    A XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport transport provides a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing a XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP and BTLS server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) will allocate a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of a XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object is stable across the life-time of the socket.

    +

    On BSD Sockets, the socket fd being readable means it's likely that the application can successfully read data from the socket. Similarily, a fd marked writable by, for example, poll() means that the application is likely to be able to write data to the BSD Sockets fd. For an application using XCM going into select(), it must always wait for all the fds its XCM sockets to become readable (e.g. being in the readfds in the select() call), regardless what are their target conditions. Thus, even if the application is waiting for an opportunity to try to send a message on a XCM socket, or it doesn't want to do anything with the socket, it must wait for the socket fd to become readable. Not wanting to do nothing here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket. An application may never leave a XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are not called.

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the a XCM server socket is in non-blocking mode at the time of a xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on a XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    A XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, and TCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided they operate on different sockets. Calls pertaining to the same sockets are not MT safe.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" a XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing a XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of a xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), a xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of a XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/doc/v1.9.0/inline_umlgraph_pnghtml.pu b/doc/v1.9.0/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..52b8cf194 --- /dev/null +++ b/doc/v1.9.0/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(17, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(88, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(50, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(3, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.9.0/jquery.js b/doc/v1.9.0/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.9.0/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.9.0/menu.js b/doc/v1.9.0/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.9.0/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.9.0/menudata.js b/doc/v1.9.0/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/doc/v1.9.0/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.9.0/minus.svg b/doc/v1.9.0/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.9.0/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.9.0/minusd.svg b/doc/v1.9.0/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.9.0/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.9.0/nav_f.png b/doc/v1.9.0/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.9.0/nav_f.png differ diff --git a/doc/v1.9.0/nav_fd.png b/doc/v1.9.0/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.9.0/nav_fd.png differ diff --git a/doc/v1.9.0/nav_g.png b/doc/v1.9.0/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.9.0/nav_g.png differ diff --git a/doc/v1.9.0/nav_h.png b/doc/v1.9.0/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.9.0/nav_h.png differ diff --git a/doc/v1.9.0/nav_hd.png b/doc/v1.9.0/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.9.0/nav_hd.png differ diff --git a/doc/v1.9.0/nb_connect_and_send.png b/doc/v1.9.0/nb_connect_and_send.png new file mode 100644 index 000000000..f32642d12 Binary files /dev/null and b/doc/v1.9.0/nb_connect_and_send.png differ diff --git a/doc/v1.9.0/nb_connect_explicit.png b/doc/v1.9.0/nb_connect_explicit.png new file mode 100644 index 000000000..8418cc73b Binary files /dev/null and b/doc/v1.9.0/nb_connect_explicit.png differ diff --git a/doc/v1.9.0/nb_delayed_connection_refused.png b/doc/v1.9.0/nb_delayed_connection_refused.png new file mode 100644 index 000000000..8429deb27 Binary files /dev/null and b/doc/v1.9.0/nb_delayed_connection_refused.png differ diff --git a/doc/v1.9.0/nb_flush_buffers_before_close.png b/doc/v1.9.0/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.9.0/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.9.0/nb_immediate_connection_refused.png b/doc/v1.9.0/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.9.0/nb_immediate_connection_refused.png differ diff --git a/doc/v1.9.0/open.png b/doc/v1.9.0/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.9.0/open.png differ diff --git a/doc/v1.9.0/plus.svg b/doc/v1.9.0/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.9.0/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.9.0/plusd.svg b/doc/v1.9.0/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.9.0/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.9.0/search/all_0.js b/doc/v1.9.0/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.9.0/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_1.js b/doc/v1.9.0/search/all_1.js new file mode 100644 index 000000000..70206c175 --- /dev/null +++ b/doc/v1.9.0/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_14',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_15',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_17',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_18',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_19',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_20',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_21',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_10.js b/doc/v1.9.0/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/doc/v1.9.0/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_11.js b/doc/v1.9.0/search/all_11.js new file mode 100644 index 000000000..482e3e761 --- /dev/null +++ b/doc/v1.9.0/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_12.js b/doc/v1.9.0/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/doc/v1.9.0/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.0/search/all_13.js b/doc/v1.9.0/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.9.0/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_14.js b/doc/v1.9.0/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/doc/v1.9.0/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_15.js b/doc/v1.9.0/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.9.0/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_16.js b/doc/v1.9.0/search/all_16.js new file mode 100644 index 000000000..3c9d9cbf8 --- /dev/null +++ b/doc/v1.9.0/search/all_16.js @@ -0,0 +1,111 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_7',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_8',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_9',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_10',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_11',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_12',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_13',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_14',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_15',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_16',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_17',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_18',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_19',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_20',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_21',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_22',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_23',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_24',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_25',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_26',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_27',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_28',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_29',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_30',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_31',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_32',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_33',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_34',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_35',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_36',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_38',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_39',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_40',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_41',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_42',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_43',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_44',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_45',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_46',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_47',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_48',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_49',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_50',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_51',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_52',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_53',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_54',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_55',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_56',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_57',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_58',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_59',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_60',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_61',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_62',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_63',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_64',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_65',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_66',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_67',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_68',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_69',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_70',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_71',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_72',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_73',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_74',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_75',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_76',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_77',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_78',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_79',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_80',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_81',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_82',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_83',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_84',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_85',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_86',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_87',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_88',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_89',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_90',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_91',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_92',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_93',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_94',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_95',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_96',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_97',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_98',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_102',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_103',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_104',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_107',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.0/search/all_2.js b/doc/v1.9.0/search/all_2.js new file mode 100644 index 000000000..6f594310c --- /dev/null +++ b/doc/v1.9.0/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_5',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_6',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_8',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_9',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_3.js b/doc/v1.9.0/search/all_3.js new file mode 100644 index 000000000..61125c0c2 --- /dev/null +++ b/doc/v1.9.0/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.9.0/search/all_4.js b/doc/v1.9.0/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/doc/v1.9.0/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_5.js b/doc/v1.9.0/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/doc/v1.9.0/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_6.js b/doc/v1.9.0/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/doc/v1.9.0/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/doc/v1.9.0/search/all_7.js b/doc/v1.9.0/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.9.0/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_8.js b/doc/v1.9.0/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/doc/v1.9.0/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.9.0/search/all_9.js b/doc/v1.9.0/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.9.0/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_a.js b/doc/v1.9.0/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/doc/v1.9.0/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_b.js b/doc/v1.9.0/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/doc/v1.9.0/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_c.js b/doc/v1.9.0/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.9.0/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_d.js b/doc/v1.9.0/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/doc/v1.9.0/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_e.js b/doc/v1.9.0/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.9.0/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.9.0/search/all_f.js b/doc/v1.9.0/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.9.0/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.9.0/search/classes_0.js b/doc/v1.9.0/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.9.0/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/close.svg b/doc/v1.9.0/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.9.0/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.9.0/search/defines_0.js b/doc/v1.9.0/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/doc/v1.9.0/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.9.0/search/enums_0.js b/doc/v1.9.0/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.9.0/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.0/search/enumvalues_0.js b/doc/v1.9.0/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/doc/v1.9.0/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.0/search/files_0.js b/doc/v1.9.0/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.9.0/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/functions_0.js b/doc/v1.9.0/search/functions_0.js new file mode 100644 index 000000000..f4492c0a5 --- /dev/null +++ b/doc/v1.9.0/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_2',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_3',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_4',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_5',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_6',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_7',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_8',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_9',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_10',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_11',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_19',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_20',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_21',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_22',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_23',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_24',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_25',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_26',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_27',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_28',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_30',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_31',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_32',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_33',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_34',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_35',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_36',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_37',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_38',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_39',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_41',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_42',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_43',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_44',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_45',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_46',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_47',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_48',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_49',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_52',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_53',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_54',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_55',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_56',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_57',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_58',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_59',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_60',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_61',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_62',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_63',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_64',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_65',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_66',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_67',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_68',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_69',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_70',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_71',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_72',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_73',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_74',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.0/search/groups_0.js b/doc/v1.9.0/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.9.0/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/groups_1.js b/doc/v1.9.0/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.9.0/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/groups_2.js b/doc/v1.9.0/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.9.0/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.9.0/search/mag.svg b/doc/v1.9.0/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.9.0/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.9.0/search/mag_d.svg b/doc/v1.9.0/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.9.0/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.9.0/search/mag_sel.svg b/doc/v1.9.0/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.9.0/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.9.0/search/mag_seld.svg b/doc/v1.9.0/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.9.0/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.9.0/search/pages_0.js b/doc/v1.9.0/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.9.0/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/pages_1.js b/doc/v1.9.0/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.9.0/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/pages_2.js b/doc/v1.9.0/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.9.0/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/pages_3.js b/doc/v1.9.0/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.9.0/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.0/search/search.css b/doc/v1.9.0/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.9.0/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.9.0/search/search.js b/doc/v1.9.0/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.9.0/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.9.0/structxcm__addr__ip.html b/doc/v1.9.0/structxcm__addr__ip.html new file mode 100644 index 000000000..d383b4c29 --- /dev/null +++ b/doc/v1.9.0/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.9.0/sync_off.png b/doc/v1.9.0/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.9.0/sync_off.png differ diff --git a/doc/v1.9.0/sync_on.png b/doc/v1.9.0/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.9.0/sync_on.png differ diff --git a/doc/v1.9.0/tab_a.png b/doc/v1.9.0/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.9.0/tab_a.png differ diff --git a/doc/v1.9.0/tab_ad.png b/doc/v1.9.0/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.9.0/tab_ad.png differ diff --git a/doc/v1.9.0/tab_b.png b/doc/v1.9.0/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.9.0/tab_b.png differ diff --git a/doc/v1.9.0/tab_bd.png b/doc/v1.9.0/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.9.0/tab_bd.png differ diff --git a/doc/v1.9.0/tab_h.png b/doc/v1.9.0/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.9.0/tab_h.png differ diff --git a/doc/v1.9.0/tab_hd.png b/doc/v1.9.0/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.9.0/tab_hd.png differ diff --git a/doc/v1.9.0/tab_s.png b/doc/v1.9.0/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.9.0/tab_s.png differ diff --git a/doc/v1.9.0/tab_sd.png b/doc/v1.9.0/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.9.0/tab_sd.png differ diff --git a/doc/v1.9.0/tabs.css b/doc/v1.9.0/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.9.0/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.9.0/topics.html b/doc/v1.9.0/topics.html new file mode 100644 index 000000000..077d145b2 --- /dev/null +++ b/doc/v1.9.0/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.9.0/xcm_8h.html b/doc/v1.9.0/xcm_8h.html new file mode 100644 index 000000000..b834c68bf --- /dev/null +++ b/doc/v1.9.0/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), a xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close a XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to a XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves a XCM socket's file descriptor, for a XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/xcm_8h_source.html b/doc/v1.9.0/xcm_8h_source.html new file mode 100644 index 000000000..aca1d1825 --- /dev/null +++ b/doc/v1.9.0/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1422#include <errno.h>
    +
    1423#include <stdbool.h>
    +
    1424#include <stddef.h>
    +
    1425#include <sys/types.h>
    +
    1426#include <xcm_attr_map.h>
    +
    1427
    +
    1429#define XCM_NONBLOCK (1<<0)
    +
    1430
    +
    1437struct xcm_socket;
    +
    1438
    +
    1491struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1492
    +
    1514struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1515 const struct xcm_attr_map *attrs);
    +
    1516
    +
    1552struct xcm_socket *xcm_server(const char *local_addr);
    +
    1553
    +
    1569struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1570 const struct xcm_attr_map *attrs);
    +
    1571
    +
    1588int xcm_close(struct xcm_socket *socket);
    +
    1589
    +
    1609void xcm_cleanup(struct xcm_socket *socket);
    +
    1610
    +
    1629struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1630
    +
    1650struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1651 const struct xcm_attr_map *attrs);
    +
    1652
    +
    1675int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1676 const void *__restrict buf, size_t len);
    +
    1677
    +
    1701int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1702 void *__restrict buf, size_t capacity);
    +
    1703
    +
    1706#define XCM_SO_RECEIVABLE (1<<0)
    +
    1709#define XCM_SO_SENDABLE (1<<1)
    +
    1711#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1712
    +
    1773int xcm_await(struct xcm_socket *socket, int condition);
    +
    1774
    +
    1822int xcm_fd(struct xcm_socket *socket);
    +
    1823
    +
    1869int xcm_finish(struct xcm_socket *socket);
    +
    1870
    +
    1911int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1912
    +
    1927bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1928
    +
    1945const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1946
    +
    1961const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1962
    +
    1963#include <xcm_compat.h>
    +
    1964
    +
    1965#ifdef __cplusplus
    +
    1966}
    +
    1967#endif
    +
    1968#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.9.0/xcm__addr_8h.html b/doc/v1.9.0/xcm__addr_8h.html new file mode 100644 index 000000000..0ee7d335e --- /dev/null +++ b/doc/v1.9.0/xcm__addr_8h.html @@ -0,0 +1,1207 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of a XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/xcm__addr_8h_source.html b/doc/v1.9.0/xcm__addr_8h_source.html new file mode 100644 index 000000000..83cd5c429 --- /dev/null +++ b/doc/v1.9.0/xcm__addr_8h_source.html @@ -0,0 +1,224 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    44#define XCM_BTCP_PROTO "btcp"
    +
    45
    +
    46enum xcm_addr_type {
    +
    47 xcm_addr_type_name,
    +
    48 xcm_addr_type_ip
    +
    49};
    +
    50
    +
    + +
    53{
    +
    55 sa_family_t family;
    +
    56
    +
    58 union {
    +
    61 in_addr_t ip4;
    +
    64 uint8_t ip6[16];
    + +
    66};
    +
    +
    67
    +
    + +
    70{
    +
    72 enum xcm_addr_type type;
    +
    73
    +
    75 union {
    +
    76 struct xcm_addr_ip ip;
    +
    77 /* Max DNS name length is 253 characters */
    +
    78 char name[254];
    +
    79 };
    +
    80};
    +
    +
    81
    +
    95int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96
    +
    110int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111 uint16_t *port);
    +
    112
    +
    126int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127 uint16_t *port);
    +
    128
    +
    143int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144 uint16_t *port);
    +
    145
    +
    160int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161 uint16_t *port);
    +
    162
    +
    176int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177
    +
    191int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192 size_t capacity);
    +
    193
    +
    207int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208 uint16_t *port);
    +
    209
    +
    223int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224 uint16_t *port);
    +
    225
    +
    241int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *utls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tls_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *tcp_addr_s, size_t capacity);
    +
    279
    +
    295int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296 char *sctp_addr_s, size_t capacity);
    +
    297
    +
    312int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313
    +
    328int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329
    +
    345int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346 char *btcp_addr_s, size_t capacity);
    +
    347
    +
    363int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    364 char *btls_addr_s, size_t capacity);
    +
    365
    +
    366#include <xcm_addr_compat.h>
    +
    367
    +
    368#ifdef __cplusplus
    +
    369}
    +
    370#endif
    +
    371#endif
    +
    Definition xcm_addr.h:70
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:72
    +
    Definition xcm_addr.h:53
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:55
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:64
    +
    in_addr_t ip4
    Definition xcm_addr.h:61
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.9.0/xcm__attr_8h.html b/doc/v1.9.0/xcm__attr_8h.html new file mode 100644 index 000000000..6029b84cf --- /dev/null +++ b/doc/v1.9.0/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/xcm__attr_8h_source.html b/doc/v1.9.0/xcm__attr_8h_source.html new file mode 100644 index 000000000..0f1968d76 --- /dev/null +++ b/doc/v1.9.0/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.9.0/xcm__attr__map_8h.html b/doc/v1.9.0/xcm__attr__map_8h.html new file mode 100644 index 000000000..267c3f859 --- /dev/null +++ b/doc/v1.9.0/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    A XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/xcm__attr__map_8h_source.html b/doc/v1.9.0/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..70f77e2b9 --- /dev/null +++ b/doc/v1.9.0/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.9.0/xcm__attr__types_8h.html b/doc/v1.9.0/xcm__attr__types_8h.html new file mode 100644 index 000000000..a97079d7d --- /dev/null +++ b/doc/v1.9.0/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/xcm__attr__types_8h_source.html b/doc/v1.9.0/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..7f941ef7b --- /dev/null +++ b/doc/v1.9.0/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.9.0/xcm__compat_8h.html b/doc/v1.9.0/xcm__compat_8h.html new file mode 100644 index 000000000..732b7fd4d --- /dev/null +++ b/doc/v1.9.0/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/xcm__compat_8h_source.html b/doc/v1.9.0/xcm__compat_8h_source.html new file mode 100644 index 000000000..37f0e4525 --- /dev/null +++ b/doc/v1.9.0/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.9.0/xcm__version_8h.html b/doc/v1.9.0/xcm__version_8h.html new file mode 100644 index 000000000..77972958f --- /dev/null +++ b/doc/v1.9.0/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   9
     
    #define XCM_VERSION_PATCH   0
     
    #define XCM_VERSION   "1.9.0"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   24
     
    #define XCM_VERSION_API   "0.24"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.0/xcm__version_8h_source.html b/doc/v1.9.0/xcm__version_8h_source.html new file mode 100644 index 000000000..938cb333b --- /dev/null +++ b/doc/v1.9.0/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 9
    +
    29
    +
    31#define XCM_VERSION_PATCH 0
    +
    32
    +
    34#define XCM_VERSION "1.9.0"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 24
    +
    48
    +
    50#define XCM_VERSION_API "0.24"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.9.1/annotated.html b/doc/v1.9.1/annotated.html new file mode 100644 index 000000000..b798b9a5f --- /dev/null +++ b/doc/v1.9.1/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.9.1/bc_s.png b/doc/v1.9.1/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.9.1/bc_s.png differ diff --git a/doc/v1.9.1/bc_sd.png b/doc/v1.9.1/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.9.1/bc_sd.png differ diff --git a/doc/v1.9.1/classes.html b/doc/v1.9.1/classes.html new file mode 100644 index 000000000..0b36d89eb --- /dev/null +++ b/doc/v1.9.1/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.9.1/closed.png b/doc/v1.9.1/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.9.1/closed.png differ diff --git a/doc/v1.9.1/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.9.1/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..b5b75e686 --- /dev/null +++ b/doc/v1.9.1/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.9.1/doc.svg b/doc/v1.9.1/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.9.1/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.1/docd.svg b/doc/v1.9.1/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.9.1/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.1/doxygen.css b/doc/v1.9.1/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.9.1/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.9.1/doxygen.svg b/doc/v1.9.1/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.9.1/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.9.1/dynsections.js b/doc/v1.9.1/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.9.1/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.9.1/files.html b/doc/v1.9.1/files.html new file mode 100644 index 000000000..c28cccc4a --- /dev/null +++ b/doc/v1.9.1/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.9.1/folderclosed.svg b/doc/v1.9.1/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.9.1/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.9.1/folderclosedd.svg b/doc/v1.9.1/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.9.1/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.9.1/folderopen.svg b/doc/v1.9.1/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.9.1/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.9.1/folderopend.svg b/doc/v1.9.1/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.9.1/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.1/functions.html b/doc/v1.9.1/functions.html new file mode 100644 index 000000000..2391e8066 --- /dev/null +++ b/doc/v1.9.1/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.9.1/functions_vars.html b/doc/v1.9.1/functions_vars.html new file mode 100644 index 000000000..dfa6e19f3 --- /dev/null +++ b/doc/v1.9.1/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.9.1/globals.html b/doc/v1.9.1/globals.html new file mode 100644 index 000000000..5a584d4b8 --- /dev/null +++ b/doc/v1.9.1/globals.html @@ -0,0 +1,187 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.9.1/globals_defs.html b/doc/v1.9.1/globals_defs.html new file mode 100644 index 000000000..a6d594f6d --- /dev/null +++ b/doc/v1.9.1/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.1/globals_enum.html b/doc/v1.9.1/globals_enum.html new file mode 100644 index 000000000..3ddb09d42 --- /dev/null +++ b/doc/v1.9.1/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.1/globals_eval.html b/doc/v1.9.1/globals_eval.html new file mode 100644 index 000000000..a6a603246 --- /dev/null +++ b/doc/v1.9.1/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.1/globals_func.html b/doc/v1.9.1/globals_func.html new file mode 100644 index 000000000..aaeaaadc9 --- /dev/null +++ b/doc/v1.9.1/globals_func.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.9.1/globals_type.html b/doc/v1.9.1/globals_type.html new file mode 100644 index 000000000..d2396c8b9 --- /dev/null +++ b/doc/v1.9.1/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.1/group__api__version.html b/doc/v1.9.1/group__api__version.html new file mode 100644 index 000000000..927e98302 --- /dev/null +++ b/doc/v1.9.1/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   24
     
    #define XCM_VERSION_API   "0.24"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   24
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.24"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/group__lib__version.html b/doc/v1.9.1/group__lib__version.html new file mode 100644 index 000000000..6a89e728f --- /dev/null +++ b/doc/v1.9.1/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   9
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.9.1"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   9
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   1
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.9.1"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/index.html b/doc/v1.9.1/index.html new file mode 100644 index 000000000..b85c619ee --- /dev/null +++ b/doc/v1.9.1/index.html @@ -0,0 +1,717 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.24 [API]
    +
    +1.9.1 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is a shared library implementing an inter-process communication service on Linux. It facilitates communication between processes on the same system, as well as over a network.

    +

    XCM internals are divided into the core library, and a number of pluggable transports, handling the actual data delivery. In combination with an URL-like addressing scheme, it allows applications to be transport agnostic, and an IPC mechanism suitable for one deployment can seamlessly be replaced with another, in another deployment. The API semantics are the same, regardless of underlying transport used.

    +

    An XCM transport either provides a messaging or a byte stream type service.

    +

    XCM supports UNIX domain sockets for efficient local-only communication, and TCP, TLS and SCTP for remote inter-process communication. The service XCM provides is of the connection-oriented, client-server type. It is not a message bus and does not implement the publish-subscribe or broadcast patterns.

    +

    This document primarily serves as an API specification, but also also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Sockets API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    An XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport and BTCP Transport transports provide a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing an XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP, BTCP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP, BTLS and BTCP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) allocates a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of an XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object remains the same across the life-time of the socket.

    +

    In the BSD Sockets API, the socket fd being readable means it's likely, but not guaranteed, that the application can successfully read data from the socket. Similarly, a fd marked writable by for example poll() signifies that the application is likely to be able to write data to the socket.

    +

    An application using non-blocking XCM sockets must always wait for the XCM socket fd to become readable (e.g., the XCM socket fd should always be in the readfds in the select() call), regardless of the target condition. Thus, even if the application is waiting for an opportunity to send a message on a XCM socket, or is not interested in performing any type of operation on the socket, it must wait for the XCM socket fd to become readable. Not being interested in performing any operation here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket.

    +

    An application must always include all of its XCM socket fds into readfds in the select() call. An application must not leave an XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or neither of xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are called when its fd is marked readable by select().

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    The inability to finish the requested operation without blocking the thread (i.e., putting the thread to sleep) is signaled in the typical UNIX manner, by returning an NULL or -1, (depending on the return type) and setting errno to EAGAIN. Unlike most other errno values, EAGAIN is a temporary conditional, and not a terminal error.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the an XCM server socket is in non-blocking mode at the time of an xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on an XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    An XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, TCP, and BTCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided they operate on different sockets. Calls pertaining to the same sockets are not MT safe.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" an XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing an XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of an xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), an xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of an XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/doc/v1.9.1/inline_umlgraph_pnghtml.pu b/doc/v1.9.1/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..3d9fdf388 --- /dev/null +++ b/doc/v1.9.1/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(101, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(5, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(6, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.9.1/jquery.js b/doc/v1.9.1/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.9.1/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.9.1/menu.js b/doc/v1.9.1/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.9.1/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.9.1/menudata.js b/doc/v1.9.1/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/doc/v1.9.1/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.9.1/minus.svg b/doc/v1.9.1/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.9.1/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.9.1/minusd.svg b/doc/v1.9.1/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.9.1/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.9.1/nav_f.png b/doc/v1.9.1/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.9.1/nav_f.png differ diff --git a/doc/v1.9.1/nav_fd.png b/doc/v1.9.1/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.9.1/nav_fd.png differ diff --git a/doc/v1.9.1/nav_g.png b/doc/v1.9.1/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.9.1/nav_g.png differ diff --git a/doc/v1.9.1/nav_h.png b/doc/v1.9.1/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.9.1/nav_h.png differ diff --git a/doc/v1.9.1/nav_hd.png b/doc/v1.9.1/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.9.1/nav_hd.png differ diff --git a/doc/v1.9.1/nb_connect_and_send.png b/doc/v1.9.1/nb_connect_and_send.png new file mode 100644 index 000000000..ec94eb015 Binary files /dev/null and b/doc/v1.9.1/nb_connect_and_send.png differ diff --git a/doc/v1.9.1/nb_connect_explicit.png b/doc/v1.9.1/nb_connect_explicit.png new file mode 100644 index 000000000..a5df8f3b6 Binary files /dev/null and b/doc/v1.9.1/nb_connect_explicit.png differ diff --git a/doc/v1.9.1/nb_delayed_connection_refused.png b/doc/v1.9.1/nb_delayed_connection_refused.png new file mode 100644 index 000000000..5c216bb18 Binary files /dev/null and b/doc/v1.9.1/nb_delayed_connection_refused.png differ diff --git a/doc/v1.9.1/nb_flush_buffers_before_close.png b/doc/v1.9.1/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.9.1/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.9.1/nb_immediate_connection_refused.png b/doc/v1.9.1/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.9.1/nb_immediate_connection_refused.png differ diff --git a/doc/v1.9.1/open.png b/doc/v1.9.1/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.9.1/open.png differ diff --git a/doc/v1.9.1/plus.svg b/doc/v1.9.1/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.9.1/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.9.1/plusd.svg b/doc/v1.9.1/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.9.1/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.9.1/search/all_0.js b/doc/v1.9.1/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.9.1/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_1.js b/doc/v1.9.1/search/all_1.js new file mode 100644 index 000000000..70206c175 --- /dev/null +++ b/doc/v1.9.1/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_14',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_15',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_17',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_18',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_19',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_20',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_21',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_10.js b/doc/v1.9.1/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/doc/v1.9.1/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_11.js b/doc/v1.9.1/search/all_11.js new file mode 100644 index 000000000..482e3e761 --- /dev/null +++ b/doc/v1.9.1/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_12.js b/doc/v1.9.1/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/doc/v1.9.1/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.1/search/all_13.js b/doc/v1.9.1/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.9.1/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_14.js b/doc/v1.9.1/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/doc/v1.9.1/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_15.js b/doc/v1.9.1/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.9.1/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_16.js b/doc/v1.9.1/search/all_16.js new file mode 100644 index 000000000..3c9d9cbf8 --- /dev/null +++ b/doc/v1.9.1/search/all_16.js @@ -0,0 +1,111 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_7',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_8',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_9',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_10',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_11',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_12',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_13',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_14',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_15',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_16',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_17',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_18',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_19',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_20',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_21',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_22',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_23',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_24',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_25',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_26',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_27',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_28',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_29',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_30',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_31',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_32',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_33',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_34',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_35',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_36',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_38',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_39',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_40',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_41',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_42',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_43',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_44',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_45',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_46',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_47',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_48',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_49',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_50',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_51',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_52',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_53',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_54',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_55',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_56',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_57',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_58',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_59',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_60',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_61',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_62',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_63',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_64',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_65',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_66',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_67',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_68',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_69',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_70',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_71',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_72',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_73',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_74',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_75',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_76',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_77',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_78',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_79',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_80',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_81',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_82',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_83',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_84',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_85',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_86',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_87',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_88',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_89',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_90',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_91',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_92',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_93',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_94',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_95',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_96',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_97',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_98',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_102',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_103',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_104',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_107',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.1/search/all_2.js b/doc/v1.9.1/search/all_2.js new file mode 100644 index 000000000..6f594310c --- /dev/null +++ b/doc/v1.9.1/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_5',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_6',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_8',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_9',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_3.js b/doc/v1.9.1/search/all_3.js new file mode 100644 index 000000000..61125c0c2 --- /dev/null +++ b/doc/v1.9.1/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.9.1/search/all_4.js b/doc/v1.9.1/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/doc/v1.9.1/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_5.js b/doc/v1.9.1/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/doc/v1.9.1/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_6.js b/doc/v1.9.1/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/doc/v1.9.1/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/doc/v1.9.1/search/all_7.js b/doc/v1.9.1/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.9.1/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_8.js b/doc/v1.9.1/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/doc/v1.9.1/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.9.1/search/all_9.js b/doc/v1.9.1/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.9.1/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_a.js b/doc/v1.9.1/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/doc/v1.9.1/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_b.js b/doc/v1.9.1/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/doc/v1.9.1/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_c.js b/doc/v1.9.1/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.9.1/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_d.js b/doc/v1.9.1/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/doc/v1.9.1/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_e.js b/doc/v1.9.1/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.9.1/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.9.1/search/all_f.js b/doc/v1.9.1/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.9.1/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.9.1/search/classes_0.js b/doc/v1.9.1/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.9.1/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/close.svg b/doc/v1.9.1/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.9.1/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.9.1/search/defines_0.js b/doc/v1.9.1/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/doc/v1.9.1/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.9.1/search/enums_0.js b/doc/v1.9.1/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.9.1/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.1/search/enumvalues_0.js b/doc/v1.9.1/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/doc/v1.9.1/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.1/search/files_0.js b/doc/v1.9.1/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.9.1/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/functions_0.js b/doc/v1.9.1/search/functions_0.js new file mode 100644 index 000000000..f4492c0a5 --- /dev/null +++ b/doc/v1.9.1/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_2',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_3',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_4',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_5',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_6',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_7',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_8',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_9',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_10',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_11',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_19',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_20',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_21',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_22',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_23',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_24',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_25',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_26',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_27',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_28',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_30',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_31',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_32',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_33',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_34',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_35',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_36',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_37',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_38',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_39',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_41',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_42',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_43',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_44',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_45',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_46',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_47',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_48',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_49',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_52',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_53',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_54',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_55',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_56',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_57',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_58',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_59',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_60',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_61',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_62',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_63',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_64',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_65',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_66',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_67',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_68',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_69',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_70',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_71',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_72',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_73',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_74',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.1/search/groups_0.js b/doc/v1.9.1/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.9.1/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/groups_1.js b/doc/v1.9.1/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.9.1/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/groups_2.js b/doc/v1.9.1/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.9.1/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.9.1/search/mag.svg b/doc/v1.9.1/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.9.1/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.9.1/search/mag_d.svg b/doc/v1.9.1/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.9.1/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.9.1/search/mag_sel.svg b/doc/v1.9.1/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.9.1/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.9.1/search/mag_seld.svg b/doc/v1.9.1/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.9.1/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.9.1/search/pages_0.js b/doc/v1.9.1/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.9.1/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/pages_1.js b/doc/v1.9.1/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.9.1/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/pages_2.js b/doc/v1.9.1/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.9.1/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/pages_3.js b/doc/v1.9.1/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.9.1/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.1/search/search.css b/doc/v1.9.1/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.9.1/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.9.1/search/search.js b/doc/v1.9.1/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.9.1/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.9.1/structxcm__addr__ip.html b/doc/v1.9.1/structxcm__addr__ip.html new file mode 100644 index 000000000..727cbbabe --- /dev/null +++ b/doc/v1.9.1/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.9.1/sync_off.png b/doc/v1.9.1/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.9.1/sync_off.png differ diff --git a/doc/v1.9.1/sync_on.png b/doc/v1.9.1/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.9.1/sync_on.png differ diff --git a/doc/v1.9.1/tab_a.png b/doc/v1.9.1/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.9.1/tab_a.png differ diff --git a/doc/v1.9.1/tab_ad.png b/doc/v1.9.1/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.9.1/tab_ad.png differ diff --git a/doc/v1.9.1/tab_b.png b/doc/v1.9.1/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.9.1/tab_b.png differ diff --git a/doc/v1.9.1/tab_bd.png b/doc/v1.9.1/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.9.1/tab_bd.png differ diff --git a/doc/v1.9.1/tab_h.png b/doc/v1.9.1/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.9.1/tab_h.png differ diff --git a/doc/v1.9.1/tab_hd.png b/doc/v1.9.1/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.9.1/tab_hd.png differ diff --git a/doc/v1.9.1/tab_s.png b/doc/v1.9.1/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.9.1/tab_s.png differ diff --git a/doc/v1.9.1/tab_sd.png b/doc/v1.9.1/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.9.1/tab_sd.png differ diff --git a/doc/v1.9.1/tabs.css b/doc/v1.9.1/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.9.1/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.9.1/topics.html b/doc/v1.9.1/topics.html new file mode 100644 index 000000000..cdb585c6c --- /dev/null +++ b/doc/v1.9.1/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.9.1/xcm_8h.html b/doc/v1.9.1/xcm_8h.html new file mode 100644 index 000000000..6b41a0753 --- /dev/null +++ b/doc/v1.9.1/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), an xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close an XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to an XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves an XCM socket's file descriptor, for an XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/xcm_8h_source.html b/doc/v1.9.1/xcm_8h_source.html new file mode 100644 index 000000000..c55ff48d3 --- /dev/null +++ b/doc/v1.9.1/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1443#include <errno.h>
    +
    1444#include <stdbool.h>
    +
    1445#include <stddef.h>
    +
    1446#include <sys/types.h>
    +
    1447#include <xcm_attr_map.h>
    +
    1448
    +
    1450#define XCM_NONBLOCK (1<<0)
    +
    1451
    +
    1458struct xcm_socket;
    +
    1459
    +
    1512struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1513
    +
    1535struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1536 const struct xcm_attr_map *attrs);
    +
    1537
    +
    1573struct xcm_socket *xcm_server(const char *local_addr);
    +
    1574
    +
    1590struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1591 const struct xcm_attr_map *attrs);
    +
    1592
    +
    1609int xcm_close(struct xcm_socket *socket);
    +
    1610
    +
    1630void xcm_cleanup(struct xcm_socket *socket);
    +
    1631
    +
    1650struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1651
    +
    1671struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1672 const struct xcm_attr_map *attrs);
    +
    1673
    +
    1696int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1697 const void *__restrict buf, size_t len);
    +
    1698
    +
    1722int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1723 void *__restrict buf, size_t capacity);
    +
    1724
    +
    1727#define XCM_SO_RECEIVABLE (1<<0)
    +
    1730#define XCM_SO_SENDABLE (1<<1)
    +
    1732#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1733
    +
    1794int xcm_await(struct xcm_socket *socket, int condition);
    +
    1795
    +
    1843int xcm_fd(struct xcm_socket *socket);
    +
    1844
    +
    1890int xcm_finish(struct xcm_socket *socket);
    +
    1891
    +
    1932int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1933
    +
    1948bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1949
    +
    1966const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1967
    +
    1982const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1983
    +
    1984#include <xcm_compat.h>
    +
    1985
    +
    1986#ifdef __cplusplus
    +
    1987}
    +
    1988#endif
    +
    1989#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.9.1/xcm__addr_8h.html b/doc/v1.9.1/xcm__addr_8h.html new file mode 100644 index 000000000..f3e82efb4 --- /dev/null +++ b/doc/v1.9.1/xcm__addr_8h.html @@ -0,0 +1,1207 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of an XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/xcm__addr_8h_source.html b/doc/v1.9.1/xcm__addr_8h_source.html new file mode 100644 index 000000000..261a3eb85 --- /dev/null +++ b/doc/v1.9.1/xcm__addr_8h_source.html @@ -0,0 +1,224 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    44#define XCM_BTCP_PROTO "btcp"
    +
    45
    +
    46enum xcm_addr_type {
    +
    47 xcm_addr_type_name,
    +
    48 xcm_addr_type_ip
    +
    49};
    +
    50
    +
    + +
    53{
    +
    55 sa_family_t family;
    +
    56
    +
    58 union {
    +
    61 in_addr_t ip4;
    +
    64 uint8_t ip6[16];
    + +
    66};
    +
    +
    67
    +
    + +
    70{
    +
    72 enum xcm_addr_type type;
    +
    73
    +
    75 union {
    +
    76 struct xcm_addr_ip ip;
    +
    77 /* Max DNS name length is 253 characters */
    +
    78 char name[254];
    +
    79 };
    +
    80};
    +
    +
    81
    +
    95int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96
    +
    110int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111 uint16_t *port);
    +
    112
    +
    126int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127 uint16_t *port);
    +
    128
    +
    143int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144 uint16_t *port);
    +
    145
    +
    160int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161 uint16_t *port);
    +
    162
    +
    176int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177
    +
    191int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192 size_t capacity);
    +
    193
    +
    207int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208 uint16_t *port);
    +
    209
    +
    223int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224 uint16_t *port);
    +
    225
    +
    241int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *utls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tls_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *tcp_addr_s, size_t capacity);
    +
    279
    +
    295int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296 char *sctp_addr_s, size_t capacity);
    +
    297
    +
    312int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313
    +
    328int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329
    +
    345int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346 char *btcp_addr_s, size_t capacity);
    +
    347
    +
    363int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    364 char *btls_addr_s, size_t capacity);
    +
    365
    +
    366#include <xcm_addr_compat.h>
    +
    367
    +
    368#ifdef __cplusplus
    +
    369}
    +
    370#endif
    +
    371#endif
    +
    Definition xcm_addr.h:70
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:72
    +
    Definition xcm_addr.h:53
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:55
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:64
    +
    in_addr_t ip4
    Definition xcm_addr.h:61
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.9.1/xcm__attr_8h.html b/doc/v1.9.1/xcm__attr_8h.html new file mode 100644 index 000000000..906261ae4 --- /dev/null +++ b/doc/v1.9.1/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/xcm__attr_8h_source.html b/doc/v1.9.1/xcm__attr_8h_source.html new file mode 100644 index 000000000..cecb9c333 --- /dev/null +++ b/doc/v1.9.1/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.9.1/xcm__attr__map_8h.html b/doc/v1.9.1/xcm__attr__map_8h.html new file mode 100644 index 000000000..446e5567c --- /dev/null +++ b/doc/v1.9.1/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/xcm__attr__map_8h_source.html b/doc/v1.9.1/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..b950ca7fd --- /dev/null +++ b/doc/v1.9.1/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.9.1/xcm__attr__types_8h.html b/doc/v1.9.1/xcm__attr__types_8h.html new file mode 100644 index 000000000..7ef4275cb --- /dev/null +++ b/doc/v1.9.1/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/xcm__attr__types_8h_source.html b/doc/v1.9.1/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..f8af9f4ed --- /dev/null +++ b/doc/v1.9.1/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.9.1/xcm__compat_8h.html b/doc/v1.9.1/xcm__compat_8h.html new file mode 100644 index 000000000..689a1decf --- /dev/null +++ b/doc/v1.9.1/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/xcm__compat_8h_source.html b/doc/v1.9.1/xcm__compat_8h_source.html new file mode 100644 index 000000000..ee0a4fd80 --- /dev/null +++ b/doc/v1.9.1/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.9.1/xcm__version_8h.html b/doc/v1.9.1/xcm__version_8h.html new file mode 100644 index 000000000..75b21fedb --- /dev/null +++ b/doc/v1.9.1/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   9
     
    #define XCM_VERSION_PATCH   1
     
    #define XCM_VERSION   "1.9.1"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   24
     
    #define XCM_VERSION_API   "0.24"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.1/xcm__version_8h_source.html b/doc/v1.9.1/xcm__version_8h_source.html new file mode 100644 index 000000000..70d4eb47c --- /dev/null +++ b/doc/v1.9.1/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 9
    +
    29
    +
    31#define XCM_VERSION_PATCH 1
    +
    32
    +
    34#define XCM_VERSION "1.9.1"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 24
    +
    48
    +
    50#define XCM_VERSION_API "0.24"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + + diff --git a/doc/v1.9.2/annotated.html b/doc/v1.9.2/annotated.html new file mode 100644 index 000000000..a6bf7d9a3 --- /dev/null +++ b/doc/v1.9.2/annotated.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structures + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structures
    +
    +
    +
    Here are the data structures with brief descriptions:
    + + + +
     Cxcm_addr_host
     Cxcm_addr_ip
    +
    +
    + + + + diff --git a/doc/v1.9.2/bc_s.png b/doc/v1.9.2/bc_s.png new file mode 100644 index 000000000..224b29aa9 Binary files /dev/null and b/doc/v1.9.2/bc_s.png differ diff --git a/doc/v1.9.2/bc_sd.png b/doc/v1.9.2/bc_sd.png new file mode 100644 index 000000000..31ca888dc Binary files /dev/null and b/doc/v1.9.2/bc_sd.png differ diff --git a/doc/v1.9.2/classes.html b/doc/v1.9.2/classes.html new file mode 100644 index 000000000..733ca23f6 --- /dev/null +++ b/doc/v1.9.2/classes.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Structure Index + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Data Structure Index
    +
    + + + + + diff --git a/doc/v1.9.2/closed.png b/doc/v1.9.2/closed.png new file mode 100644 index 000000000..98cc2c909 Binary files /dev/null and b/doc/v1.9.2/closed.png differ diff --git a/doc/v1.9.2/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/v1.9.2/dir_d44c64559bbebec7f509842c48db8b23.html new file mode 100644 index 000000000..ed53cc59d --- /dev/null +++ b/doc/v1.9.2/dir_d44c64559bbebec7f509842c48db8b23.html @@ -0,0 +1,110 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include Directory Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    include Directory Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + +

    +Files

     xcm.h
     This file contains the core Extensible Connection-oriented Messaging (XCM) API.
     
     xcm_addr.h
     This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.
     
     xcm_attr.h
     This file contains the XCM attribute access API. See Socket Attributes for an overview.
     
     xcm_attr_map.h
     This file contains the XCM attribute map API.
     
     xcm_attr_types.h
     This file contains type definitions for the XCM attribute access API.
     
     xcm_compat.h
     This file contains obsolete parts of the XCM core API.
     
     xcm_version.h
     This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.
     
    +
    + + + + diff --git a/doc/v1.9.2/doc.svg b/doc/v1.9.2/doc.svg new file mode 100644 index 000000000..0b928a531 --- /dev/null +++ b/doc/v1.9.2/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.2/docd.svg b/doc/v1.9.2/docd.svg new file mode 100644 index 000000000..ac18b2755 --- /dev/null +++ b/doc/v1.9.2/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.2/doxygen.css b/doc/v1.9.2/doxygen.css new file mode 100644 index 000000000..009a9b554 --- /dev/null +++ b/doc/v1.9.2/doxygen.css @@ -0,0 +1,2045 @@ +/* The standard CSS for doxygen 1.9.8*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: var(--font-family-monospace); + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + color: var(--fragment-foreground-color); + background-color: var(--fragment-background-color); + border: 1px solid var(--fragment-border-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/doc/v1.9.2/doxygen.svg b/doc/v1.9.2/doxygen.svg new file mode 100644 index 000000000..79a763540 --- /dev/null +++ b/doc/v1.9.2/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/v1.9.2/dynsections.js b/doc/v1.9.2/dynsections.js new file mode 100644 index 000000000..b73c82889 --- /dev/null +++ b/doc/v1.9.2/dynsections.js @@ -0,0 +1,192 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + var id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + var start = $(this).attr('data-start'); + var end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + var line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); +} + +/* @license-end */ diff --git a/doc/v1.9.2/files.html b/doc/v1.9.2/files.html new file mode 100644 index 000000000..30f4cab85 --- /dev/null +++ b/doc/v1.9.2/files.html @@ -0,0 +1,93 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): File List + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    File List
    +
    +
    +
    Here is a list of all documented files with brief descriptions:
    +
    [detail level 12]
    + + + + + + + + +
      include
     xcm.hThis file contains the core Extensible Connection-oriented Messaging (XCM) API
     xcm_addr.hThis is an API for building and parsing Connection-oriented Messaging (XCM) addresses
     xcm_attr.hThis file contains the XCM attribute access API. See Socket Attributes for an overview
     xcm_attr_map.hThis file contains the XCM attribute map API
     xcm_attr_types.hThis file contains type definitions for the XCM attribute access API
     xcm_compat.hThis file contains obsolete parts of the XCM core API
     xcm_version.hThis file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention
    +
    +
    + + + + diff --git a/doc/v1.9.2/folderclosed.svg b/doc/v1.9.2/folderclosed.svg new file mode 100644 index 000000000..b04bed2e7 --- /dev/null +++ b/doc/v1.9.2/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.9.2/folderclosedd.svg b/doc/v1.9.2/folderclosedd.svg new file mode 100644 index 000000000..52f0166a2 --- /dev/null +++ b/doc/v1.9.2/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/v1.9.2/folderopen.svg b/doc/v1.9.2/folderopen.svg new file mode 100644 index 000000000..f6896dd25 --- /dev/null +++ b/doc/v1.9.2/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/doc/v1.9.2/folderopend.svg b/doc/v1.9.2/folderopend.svg new file mode 100644 index 000000000..2d1f06e7b --- /dev/null +++ b/doc/v1.9.2/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doc/v1.9.2/functions.html b/doc/v1.9.2/functions.html new file mode 100644 index 000000000..a24a12525 --- /dev/null +++ b/doc/v1.9.2/functions.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.9.2/functions_vars.html b/doc/v1.9.2/functions_vars.html new file mode 100644 index 000000000..59262f180 --- /dev/null +++ b/doc/v1.9.2/functions_vars.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Data Fields - Variables + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented variables with links to the struct/union documentation for each field:
    +
    + + + + diff --git a/doc/v1.9.2/globals.html b/doc/v1.9.2/globals.html new file mode 100644 index 000000000..57e63880b --- /dev/null +++ b/doc/v1.9.2/globals.html @@ -0,0 +1,187 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.9.2/globals_defs.html b/doc/v1.9.2/globals_defs.html new file mode 100644 index 000000000..cc239fcbd --- /dev/null +++ b/doc/v1.9.2/globals_defs.html @@ -0,0 +1,102 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented macros with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.2/globals_enum.html b/doc/v1.9.2/globals_enum.html new file mode 100644 index 000000000..0c423d353 --- /dev/null +++ b/doc/v1.9.2/globals_enum.html @@ -0,0 +1,81 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enums with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.2/globals_eval.html b/doc/v1.9.2/globals_eval.html new file mode 100644 index 000000000..070cf9505 --- /dev/null +++ b/doc/v1.9.2/globals_eval.html @@ -0,0 +1,85 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented enum values with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.2/globals_func.html b/doc/v1.9.2/globals_func.html new file mode 100644 index 000000000..7673631c5 --- /dev/null +++ b/doc/v1.9.2/globals_func.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented functions with links to the documentation:
    + +

    - x -

    +
    + + + + diff --git a/doc/v1.9.2/globals_type.html b/doc/v1.9.2/globals_type.html new file mode 100644 index 000000000..325a568bf --- /dev/null +++ b/doc/v1.9.2/globals_type.html @@ -0,0 +1,82 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Globals + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Here is a list of all documented typedefs with links to the documentation:
    +
    + + + + diff --git a/doc/v1.9.2/group__api__version.html b/doc/v1.9.2/group__api__version.html new file mode 100644 index 000000000..b7b2b9548 --- /dev/null +++ b/doc/v1.9.2/group__api__version.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): API Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    API Version
    +
    +
    + + + + + + + + +

    +Macros

    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   24
     
    #define XCM_VERSION_API   "0.24"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_API_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MAJOR   0
    +
    +

    The XCM API/ABI major version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_API_MINOR   24
    +
    +

    The XCM API/ABI minor version this library version implements.

    + +
    +
    + +

    ◆ XCM_VERSION_API

    + +
    +
    + + + + +
    #define XCM_VERSION_API   "0.24"
    +
    +

    The complete XCM API version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/group__lib__version.html b/doc/v1.9.2/group__lib__version.html new file mode 100644 index 000000000..6360613ab --- /dev/null +++ b/doc/v1.9.2/group__lib__version.html @@ -0,0 +1,157 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Library Version + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    Library Version
    +
    +
    + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   9
     
    #define XCM_VERSION_PATCH   2
     
    #define XCM_VERSION   "1.9.2"
     
    +

    Detailed Description

    +

    Macro Definition Documentation

    + +

    ◆ XCM_VERSION_MAJOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MAJOR   1
    +
    +

    The XCM library major version.

    + +
    +
    + +

    ◆ XCM_VERSION_MINOR

    + +
    +
    + + + + +
    #define XCM_VERSION_MINOR   9
    +
    +

    The XCM library minor version.

    + +
    +
    + +

    ◆ XCM_VERSION_PATCH

    + +
    +
    + + + + +
    #define XCM_VERSION_PATCH   2
    +
    +

    The XCM library patch version.

    + +
    +
    + +

    ◆ XCM_VERSION

    + +
    +
    + + + + +
    #define XCM_VERSION   "1.9.2"
    +
    +

    The complete XCM library version in string format.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/index.html b/doc/v1.9.2/index.html new file mode 100644 index 000000000..4a8ecee55 --- /dev/null +++ b/doc/v1.9.2/index.html @@ -0,0 +1,718 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Extensible Connection-oriented Messaging + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Extensible Connection-oriented Messaging
    +
    +
    +

    Table of Contents

    + +
    +

    +Introduction

    +

    This is the API documentation for the Extensible Connection-oriented Messaging (XCM) library.

    +

    The XCM API consists of the following parts:

    +
    Author
    Mattias Rönnblom
    +
    Version
    0.24 [API]
    +
    +1.9.2 [Implementation]
    +

    The low API/ABI version number is a result of all XCM releases being backward compatible, and thus left the major version at 0.

    +

    +Overview

    +

    XCM is a shared library implementing an inter-process communication service on Linux. It facilitates communication between processes on the same system, as well as over a network.

    +

    XCM internals are divided into the core library, and a number of pluggable transports, handling the actual data delivery. In combination with an URL-like addressing scheme, it allows applications to be transport agnostic, and an IPC mechanism suitable for one deployment can seamlessly be replaced with another, in another deployment. The API semantics are the same, regardless of underlying transport used.

    +

    An XCM transport either provides a messaging or a byte stream type service.

    +

    XCM supports UNIX domain sockets for efficient local-only communication, and TCP, TLS and SCTP for remote inter-process communication. The service XCM provides is of the connection-oriented, client-server type. It is not a message bus and does not implement the publish-subscribe or broadcast patterns.

    +

    This document primarily serves as an API specification, but also also contains information specific to the implementation.

    +

    XCM reuses much of the terminology of the BSD Sockets API. Compared to the BSD Sockets API, XCM has more uniform semantics across underlying transports.

    +

    +Overall Semantics

    +

    XCM implements a connection-oriented, client-server model. The server process creates one or more server sockets (e.g, with xcm_server()) bound to a specific address, after which clients may successfully establish connections to the server. When a connection is establishment, two connection sockets will be created; one on the server side (e.g., returned from xcm_accept()), and one of the client side (e.g., returned from xcm_connect()). Thus, a server serving multiple clients will have multiple sockets; one server socket and N connection sockets, one each for every client. A client will typically have one connection socket for each server it is connected to.

    +

    User application data (messages or bytes, depending on service type) are always sent and received on a particular connection socket - never on a server socket.

    +

    +Messaging and Byte Streams

    +

    An XCM transport either provides a messaging or a byte stream service.

    +

    Messaging transports preserve message boundaries across the network. The buffer passed to xcm_send() constitutes one (and only one) message. What's received on the other end, in exactly one xcm_receive() call, is a buffer with the same length and contents.

    +

    The UX Transport, TCP Transport, TLS Transport, UTLS Transport, and SCTP Transport all provide a messaging type service.

    +

    For byte streams, there's no such thing as message boundaries: the data transported on the connection is just a sequence of bytes. The fact that xcm_send() accepts an array of bytes of a particular length, as opposed to individual bytes one-by-one, is a mere performance optimization.

    +

    For example, if two messages "abc" and "d" are passed to xcm_send() on to a messaging transport, they will arrive as "abc" and "d" in exactly two xcm_receive() call on the receiver. On a byte stream transport however, all the data "abcd" may arrive in a single xcm_receive(), or it may arrive in multiple calls, such as three calls, each producing "ab", "c", and "d", respectively, or any other combination.

    +

    The BTLS Transport and BTCP Transport transports provide a byte stream service.

    +

    Applications that allow the user to configure an arbitrary XCM address, but are designed to handle only a certain service type, may limit what type of sockets may be instantiated to be of only the messaging service type, or only byte stream, by passing the "xcm.service" attribute with the appropriate value (see Generic Attributes for details) at the time of socket creation. Because of XCM's history as a messaging-only framework, "xcm.service" defaults to "messaging".

    +

    Applications which are designed to handle both messaging and byte stream transports may retrieve the value of "xcm.service" and use it to differentiate the treatment where so is required (e.g., in xcm_send() return code handling).

    +

    Connections spawned off a server socket (e.g., with xcm_accept()) always have the same service type as their parent socket.

    +

    +Ordering Guarantees

    +

    In-order delivery - that data arrives at the recipient in the same order it was sent by the sender - is guaranteed, but only for data sent on the same connection.

    +

    +Flow Control

    +

    XCM transports support flow control. Thus, if the sender message rate or bandwidth is higher than the network or the receiver can handle on a particular connection, xcm_send() in the sender process will eventually block (or return an error EAGAIN, if in non-blocking mode). Unless XCM is used for bulk data transfer (as oppose to signaling traffic), xcm_send() blocking because of slow network or a slow receiver should be rare in practice. TCP, TLS, and UNIX domain socket transports all have large protocol windows and/or socket buffers to allow a large amount of outstanding data.

    +

    +Addressing and Transport Selection

    +

    In XCM, the application is in control of which transport will be used, using the address supplied to xcm_connect() and xcm_server() including both the transport name and the transport address.

    +

    However, there is nothing preventing an XCM transport to use a more abstract addressing format, and internally include multiple underlying IPC transport mechanism. This model is implemented by the UTLS Transport.

    +

    +Address Syntax

    +

    Addresses are represented as strings with the following general syntax: <transport-name>:<transport-address>

    +

    For the UX UNIX Domain Socket transport, the addresses has this more specific form:
    +

    ux:<UNIX domain socket name>
    +

    The addresses of the UXF UNIX Domain Socket transport variant have the following format:
    +

    uxf:<file system path>
    +

    For the TCP, TLS, UTLS, SCTP, BTCP and BTLS transports the syntax is:
    +

    tcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    tls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    utls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    sctp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btcp:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +
    btls:(<DNS domain name>|<IPv4 address>|[<IPv6 address>]|[*]|*):<port>
    +

    '*' is a shorthand for '0.0.0.0' (i.e. bind to all IPv4 interfaces). '[*]' is the IPv6 equivalent, creating a server socket accepting connections on all IPv4 and IPv6 addresses.

    +

    Some example addresses:

    tcp:*:4711
    +
    tls:192.168.1.42:4711
    +
    tcp:[::1]:99
    +
    tcp:[*]:4711
    +
    tls:service:4711
    +
    sctp:service.company.com:42
    +
    btls:*:42
    +

    For TCP, TLS, UTLS, SCTP, BTLS and BTCP server socket addresses, the port can be set to 0, in which case XCM (or rather, the Linux kernel) allocates a free TCP port from the local port range.

    +

    +DNS Resolution

    +

    For transports allowing a DNS domain name as a part of the address, the transport will attempt to resoĺv the name to an IP address. A DNS domain name may resolv to zero or more IPv4 addresses and/or zero or more IPv6 addresses. XCM relies on the operating system to prioritize between IPv4 and IPv6.

    +

    By default, XCM will only connect to the first (highest-priority) IP address provided by DNS. This behavior can be changed for all TCP-based transports using the "dns.algorithm" attribute. See DNS Socket Attributes for more information.

    +

    +IPv4 Address Format

    +

    XCM accepts IPv4 addresses in the dotted-decimal format

    130.236.254.2
    +

    XCM allows only complete addresses with three '.', and not the archaic, classful, forms, where some bytes where left out, and thus the address contained fewer separators.

    +

    +IPv6 Link Local Addresses

    +

    IPv6 link local addresses (i.e., fe80::/10) are not guaranteed to be unique outside a particular broadcast domain. To create such a socket an application must, besides the link local address to use, also supply a scope identifier, to allow the kernel to select which network interface to use.

    +

    The IPv6 scope id is not a part of an XCM address, but instead provided by the application as a socket attribute "ipv6.scope". See TCP Socket Attributes for details.

    +

    The rationale for this URI-style design choice, compared to the also-common practice to include a network interface name in the address ("<IPv6 address>%<if-name>"), is that the IPv6 scope identifiers are strictly local to the node and thus conceptually not a part of the address. One host may use a particular scope id to refer to a particular network, and another host on the same network may use a different.

    +

    +Dead Peer Detection

    +

    XCM transports attempt to detect a number of conditions which can lead to lost connectivity, and does so even on idle connections.

    +

    If the remote end closes the connection, the local xcm_receive() will return 0. If the process on the remote end crashed, xcm_receive() will return -1 and set errno ECONNRESET. If network connectivity to the remote end is lost, xcm_receive() will return -1 and errno will be set to ETIMEDOUT.

    +

    +Error Handling

    +

    In general, XCM follows the UNIX system API tradition when it comes to error handling. Where possible, errors are signaled to the application by using unused parts of the value range of the function return type. For functions returning signed integer types, this means the value of -1 (in case -1 is not a valid return value). For functions returning pointers, NULL is used to signal that an error has occurred. For functions where neither -1 or NULL can be used, or where the function does not return anything (side-effect only functions), an 'int' is used as the return type, and is used purely for the purpose to signal success (value 0), or an error (-1) to the application.

    +

    The actual error code is stored in the thread-local errno variable. The error codes are those from the fixed set of errno values defined by POSIX, found in errno.h. Standard functions such as perror() and strerror() may be used to turn the code into a human-readable string.

    +

    In non-blocking operation, given the fact the actual transmission might be defered (and the message buffered in the XCM layer), and that message receive processing might happen before the application has called receive, the error being signaled at the point of a certain XCM call might not be a direct result of the requested operation, but rather an error discovered previously.

    +

    The documentation for xcm_finish() includes a list of generic error codes, applicable xcm_connect(), xcm_accept(), xcm_send() and xcm_receive().

    +

    Also, for errors resulting in an unusable connection, repeated calls will produce the same errno.

    +

    +Event-driven Programming Support

    +

    In UNIX-style event-driven programming, a single application thread handles multiple clients (and thus multiple XCM connection sockets) and the task of accepting new clients on the XCM server socket concurrently (although not in parallel). To wait for events from multiple sources, an I/O multiplexing facility such as select(2), poll(2) or epoll(2) is used.

    +

    Each XCM socket is represented by a single fd, retrieved with xcm_fd(). The fd number and underlying file object remains the same across the life-time of the socket.

    +

    In the BSD Sockets API, the socket fd being readable means it's likely, but not guaranteed, that the application can successfully read data from the socket. Similarly, a fd marked writable by for example poll() signifies that the application is likely to be able to write data to the socket.

    +

    An application using non-blocking XCM sockets must always wait for the XCM socket fd to become readable (e.g., the XCM socket fd should always be in the readfds in the select() call), regardless of the target condition. Thus, even if the application is waiting for an opportunity to send a message on a XCM socket, or is not interested in performing any type of operation on the socket, it must wait for the XCM socket fd to become readable. Not being interested in performing any operation here means that the application has the xcm_await() condition set to 0, and is neither interested in waiting to call xcm_send(), xcm_receive(), nor xcm_accept() on the socket.

    +

    An application must always include all of its XCM socket fds into readfds in the select() call. An application must not leave an XCM socket unattended in the sense its fd is not in the set of fds passed to select() and/or neither of xcm_send(), xcm_receive(), xcm_accept() or xcm_finish() are called when its fd is marked readable by select().

    +

    +Supported I/O Multiplexing Facilities

    +

    XCM is oblivious to what I/O multiplexing mechanism employed by the application. It may call select(), poll() or epoll_wait() directly, or make use of any of the many available event loop libraries (such as libevent). For simplicity, select() is used in this documentation to denote the whole family of Linux I/O multiplexing facilities.

    +

    +Non-blocking Operation

    +

    An event-driven application needs to set the XCM sockets it handles into non-blocking mode, by calling xcm_set_blocking(), setting the "xcm.blocking" socket attribute, or using the XCM_NONBLOCK flag in xcm_connect().

    +

    For XCM sockets in non-blocking mode, all potentially blocking API calls related to XCM connections - xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive() - finish immediately.

    +

    The inability to finish the requested operation without blocking the thread (i.e., putting the thread to sleep) is signaled in the typical UNIX manner, by returning an NULL or -1, (depending on the return type) and setting errno to EAGAIN. Unlike most other errno values, EAGAIN is a temporary conditional, and not a terminal error.

    +

    For xcm_send(), xcm_connect() and xcm_accept(), XCM signaling success means that the XCM layer has accepted the request. It may or may not have completed the operation.

    +

    +Non-blocking Connection Establishment

    +

    In case the XCM_NONBLOCK flag is set in the xcm_connect() call, or in case the an XCM server socket is in non-blocking mode at the time of an xcm_accept() call, the newly created XCM connection returned to the application may be in a semi-operational state, with some internal processing and/or signaling with the remote peer still required before actual message transmission and reception may occur.

    +

    The application may attempt to send or receive messages on such semi-operational connections.

    +

    There are ways for an application to determine when connection establishment or the task of accepting a new client have completed. See Finishing Outstanding Tasks for more information.

    +

    +Non-blocking Send and Receive

    +

    To receive a message on an XCM connection socket in non-blocking mode, the application may need to wait for the right conditions to arise (i.e. a message being available). The application needs to inform the socket that it wants to receive by calling xcm_await() with the XCM_SO_RECEIVABLE bit in the condition bit mask set. It will pass the fd it received from xcm_fd() into select(), asking to get notified when the fd becomes readable. When select() marks the socket fd as readable, the application should issue xcm_receive() to attempt to retrieve a message.

    +

    xcm_receive() may also called on speculation, prior to any select() call, to poll the socket for incoming messages.

    +

    An XCM connection socket may have a number of messages buffered, and applications should generally, for optimal performance, repeat xcm_receive() until it returns an error, and errno is set to EAGAIN.

    +

    Similarly to receiving a message, an application may set the XCM_SO_SENDABLE bit in the condition bit mask, if it wants to wait for a socket state where it's likely it can successfully send a message. When select() marks the socket fd as readable, the application should attempt to send a message.

    +

    Just like with xcm_receive(), it may also choose to issue a xcm_send() call on speculation (i.e. without going into select()), which is often a good idea for performance reasons.

    +

    For send operations on non-blocking connection sockets, XCM may buffer whole or part of the message (or data, for byte stream transports) before transmission to the lower layer. This may be due to socket output buffer underrun, or the need for some in-band signaling, like cryptographic key exchange, to happen before the transmission of the complete message may finish. The XCM layer will (re-)attempt to hand the message over to the lower layer at a future call to xcm_finish(), xcm_send(), or xcm_receive().

    +

    For applications wishing to determine when all buffered data have successfully been deliver to the lower layer, may use xcm_finish() to do so. Normally, applications aren't expected to require this kind of control. Please also note that the fact a message has left the XCM layer doesn't necessarily mean it has successfully been delivered to the recipient. In particular, if for some reason the data can be dispatched immediately, it may be lingering in kernel buffers. Such buffers may be discarded in case the application close the connection.

    +

    +Finishing Outstanding Tasks

    +

    xcm_connect(), xcm_accept(), xcm_send() may all leave the socket in a state where work is initiated, but not completed. In addition, the socket may have pending internal tasks, such flushing the output buffer into the TCP/IP stack, processing XCM control interface messages, or finishing the TLS hand shake procedure.

    +

    After waking up from a select() call, where a particular XCM non-blocking socket's fd is marked readable, the application must, if no xcm_send(), xcm_receive() or xcm_accept() calls are to be made, call xcm_finish(). This is to allow the socket to finish any outstanding tasks, even in the case the application has no immediate plans for the socket.

    +

    Prior to changing a socket from non-blocking to blocking mode, any outstanding tasks should be finished, or otherwise the switch might cause xcm_set_blocking() to return -1 and set errno to EAGAIN.

    +

    +Ready Status Semantics

    +

    For example, if a server socket's desired condition has been set (with xcm_await()) to XCM_SO_ACCEPTABLE, and the application wakes up from select() with the socket's fd marked readable, a call to xcm_accept() may still not produce a new connection socket.

    +

    The same holds true when reaching XCM_SO_RECEIVABLE and a xcm_receive() call is made, and XCM_SO_SENDABLE and calls to xcm_send().

    +

    +Non-blocking Example Sequences

    +

    +Connect and Send Message

    +

    In this example, the application connects and tries to send a message, before knowing if the connection is actually established. This may fail (for example, in case TCP and/or TLS-level connection establishment has not yet been completed), in which case the application will fall back and wait with the use of xcm_await(), xcm_fd() and select().

    +
    + +
    +

    +Connect with Explicit Finish

    +

    In case the application wants to know when the connection establishment has finished, it may use xcm_finish() to do so, like in the below example sequence.

    +
    + +
    +

    +Immediate Connection Refused

    +

    While connecting to a server socket, the client's connection attempt may be refused immediately.

    +
    + +
    +

    +Delayed Connection Refused

    +

    In many cases, the application is handed a connection socket before the connection establishment is completed. Any errors occuring during this process is handed over to the application at a future call to xcm_finish(), xcm_send() or xcm_receive().

    +
    + +
    +

    +Buffer Flush Before Close

    +

    In this example the application flushes any internal XCM buffers before shutting down the connection, to ensure that any buffered messages are delivered to the lower layer.

    +
    + +
    +

    +Server Accept

    +

    In this sequence, a server accepts a new connection, and continues to attempt to receive a message on this connection, while still, concurrently, is ready to accept more clients on the server socket.

    +
    + +
    +

    +Socket Attributes

    +

    Tied to an XCM server or connection socket is a set of key-value pairs known as attributes. Which attributes are available varies across different transports, and different socket types.

    +

    An attribute's name is a string, and follows a hierarchical naming schema. For example, all generic XCM attributes, available in all transports, have the prefix "xcm.". Transport-specific attributes are prefixed with the transport or protocol name (e.g. "tcp." for TCP-specific attributes applicable to the TLS, BTLS, TCP, and BTCP transports).

    +

    An attribute may be read-only, write-only or available both for reading and writing. This is referred to as the attribute's mode. The mode may vary across the lifetime of the socket. For example, an attribute may be writable at the time of the xcm_connect() call, and read-only thereafter.

    +

    The attribute value is coded in the native C data type and byte order. Strings are NUL-terminated, and the NUL character is included in the length of the attribute. There are four value types; a boolean type, a 64-bit signed integer type, a string type and a type for arbitrary binary data. See xcm_attr_types.h for details.

    +

    The attribute access API is in xcm_attr.h.

    +

    Retrieving an integer attribute's value may look like this:

    int64_t rtt;
    +
    xcm_attr_get(tcp_conn_socket, "tcp.rtt", NULL, &rtt, sizeof(rtt));
    +
    printf("Current TCP round-trip time estimate is %ld us.", rtt);
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +

    Changing an integer attribyte value may be done in the following manner:

    int64_t interval = 10;
    +
    xcm_attr_set(tcp_conn_socket, "tcp.keepalive_interval", xcm_attr_type_int64, &interval, sizeof(interval));
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +

    Both of these examples are missing error handling.

    +

    +Attribute Maps

    +

    XCM allows supplying a set of writable attributes at the time of socket creation, by using the xcm_connect_a(), xcm_server_a(), or xcm_accept_a() functions.

    +

    The attribute sets are represented by the xcm_attr_map type in xcm_attr_map.h.

    +

    The caller retains the ownership of the xcm_attr_map passed to xcm_connect_a(), xcm_server_a(), or xcm_accept_a(), and may destroy it after the call has completed, or reuse it.

    +

    A somewhat contrived example:

    struct xcm_attr_map *attrs = xcm_attr_map_create();
    +
    xcm_attr_map_add_bool(attrs, "xcm.blocking", false);
    +
    xcm_attr_map_add_str(attrs, "xcm.local_addr", "tls:192.168.1.42:0");
    +
    xcm_attr_map_add_bool(attrs, "tls.verify_peer_name", true);
    +
    xcm_attr_map_add_str(attrs, "tls.peer_names", "myservice");
    +
    xcm_attr_map_add_int64(attrs, "tcp.keepalive_interval", 10);
    +
    +
    struct xcm_socket *conn = xcm_connect_a("tls:192.168.1.99:4711", attrs);
    +
    + +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +

    +Attribute Inheritance

    +

    Connection sockets spawned off a server sockets will inherit the server socket's attributes that also applies to connection sockets. An application may override such values by passing a different values in the xcm_accept_a() call.

    +

    +Generic Attributes

    +

    These attributes are expected to be found on XCM sockets regardless of transport type.

    +

    For TCP and BTCP transport-specific attributes, see TCP Socket Attributes, and for TLS and BTLS, see TLS Socket Attributes. For DNS-related attributes (shared among all TCP-based transports) see DNS Socket Attributes.

    + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.type All String R The socket type: "server" or "connection".
    xcm.transport All String R The transport type.
    xcm.service All String RW The service type: "messaging" or "bytestream". Writable only at the time of socket creation. If specified, it may be used by an application to limit the type of transports being used. The string "any" may be used to signify that any type of service is accepted. The default value is "messaging".
    xcm.local_addr All String RW The local address of a socket. Writable only if supplied to xcm_connect_a() together with a TLS, UTLS or TCP type address. Usually only needs to be written on multihomed hosts, in cases where the application needs to specify the source IP address to be used. Also see xcm_local_addr().
    xcm.blocking All Boolean RW See xcm_set_blocking() and xcm_is_blocking(). The default value is true.
    xcm.remote_addr Connection String R See xcm_remote_addr().
    xcm.max_msg_size Connection Integer R The maximum size of any message transported by this connection.
    +

    +Generic Counter Attributes

    +

    XCM connections sockets keeps track of the amount of data entering or leaving the XCM layer, both from the application and to the lower layer. Additionally, messaging transports also track the number of messages.

    +

    Some of the message and byte counter attributes use the concept of a "lower layer". What this means depends on the transport. For the UX and TCP transports, it is the Linux kernel. For example, for TCP, if the xcm.to_lower_msgs is incremented, it means that XCM has successfully sent the complete message to the kernel's networking stack for further processing. It does not means it has reached the receiving process. It may have, but it also may be sitting on the local or remote socket buffer, on a NIC queue, or be in-transmit in the network. For TLS, the lower layer is OpenSSL.

    +

    The counters only reflect data succesfully sent and/or received.

    +

    +Byte Counter Attributes

    +

    These counters are available on both byte stream and messaging type connection sockets.

    +

    The byte counters are incremented with the length of the XCM data (as in the length field in xcm_send()), and thus does not include any underlying headers or other lower layer overhead.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_bytes Connection Integer R Bytes sent from the application and accepted into XCM.
    xcm.to_app_bytes Connection Integer R Bytes delivered from XCM to the application.
    xcm.from_lower_bytes Connection Integer R Bytes received by XCM from the lower layer.
    xcm.to_lower_bytes Connection Integer R Bytes successfully sent by XCM into the lower layer.
    +

    +Message Counter Attributes

    +

    These counters are available only on messaging type connection sockets.

    + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    xcm.from_app_msgs Connection Integer R Messages sent from the application and accepted into XCM.
    xcm.to_app_msgs Connection Integer R Messages delivered from XCM to the application.
    xcm.from_lower_msgs Connection Integer R Messages received by XCM from the lower layer.
    xcm.to_lower_msgs Connection Integer R Messages successfully sent by XCM into the lower layer.
    +

    +Control Interface

    +

    XCM includes a control interface, which allows iteration over the OS instance's XCM server and connection sockets (for processes with the appropriate permissions), and access to their attributes (see Socket Attributes).

    +

    Security-sensitive attributes (e.g., tls.key) cannot be accessed.

    +

    The control interface is optional by means of build-time configuration.

    +

    For each XCM server or connection socket, there is a corresponding UNIX domain socket which is used for control signaling (i.e. state retrieval).

    +

    +Control UNIX Socket Directory

    +

    By default, the control interface's UNIX domain sockets are stored in the /run/xcm/ctl directory.

    +

    This directory should to be created prior to running any XCM applications for the control interface to worker properly and should be writable for all XCM users.

    +

    A particular process using XCM may be configured to use a non-default directory for storing the UNIX domain sockets used for the control interface by means of setting the XCM_CTL variable. Please note that using this setting will cause the XCM connections to be not visible globally on the OS instance (unless all other XCM-using processes also are using this non-default directory).

    +

    +Control Interface Error Handling

    +

    Generally, since the application is left unaware (from an API perspective) of the existence of the control interface, errors are not reported up to the application. They are however logged.

    +

    Application threads owning XCM sockets, but which are busy with non-XCM processing for a long duration of time, or otherwise are leaving their XCM sockets unattended to (in violation of XCM API contract), will not respond on the control interface's UNIX domain sockets (corresponding to their XCM sockets). Only the presence of these sockets may be detected, but their state cannot be retrieved.

    +

    +Control API

    +

    Internally, the XCM implementation has control interface client library, but this library's API is not public at this point.

    +

    +Command-line Control Program

    +

    XCM includes a command-line program xcmctl which uses the Control API to iterate of the system's current XCM sockets, and allow access (primarily for debugging purposes) to the sockets' attributes.

    +

    +Thread Safety

    +

    XCM API calls are MT safe provided they operate on different sockets. Calls pertaining to the same sockets are not MT safe.

    +

    Thus, multiple threads may make XCM API calls in parallel, provided the calls refer to different XCM sockets.

    +

    An XCM socket may not be shared among different threads without synchronization external to XCM. Provided calls are properly serialized (e.g., with a mutex lock), a socket may be shared by different threads in the samea process. However, this might prove difficult since a thread in a blocking XCM function will continue to hold the lock, preventing other threads from accessing the socket.

    +

    For non-blocking sockets (with external synchronization), threads sharing a socket need to agree on what is the appropriate socket condition to wait for. When this condition is met, all threads are woken up, returning from select().

    +

    It is safe to "give away" an XCM socket from one thread to another, provided the appropriate memory fences are used.

    +

    These limitations (compared to BSD Sockets) are in place to allow socket state outside the kernel (which is required for TCP framing and TLS).

    +

    +Multi-processing and Fork

    +

    Sharing an XCM socket between threads in different processes is not possible.

    +

    After a fork() call, either of the two process (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may not call any other XCM API call than xcm_cleanup(), which frees local memory tied to this socket in the non-owner's process address space, without impacting the connection state in the owner process.

    +

    +Transports

    +

    The core XCM API functions are oblivious to the transports used. However, the support for building, and parsing addresses are available only for a set of pre-defined set of transports. There is nothing preventing xcm_addr.h from being extended, and also nothing prevents an alternative XCM implementation to include more transports without extending the address helper API.

    +

    +UX Transport

    +

    The UX transport uses UNIX Domain (AF_UNIX, also known as AF_LOCAL) Sockets to providing a service of the messaging type.

    +

    UX sockets may only be used with the same OS instance (or, more specifically, between processes in the same Linux kernel network namespace).

    +

    UNIX Domain Sockets comes in a number of flavors, and XCM uses the SOCK_SEQPACKET variety. SOCK_SEQPACKET sockets are connection-oriented, preserves message boundaries and delivers messages in the same order they were sent; perfectly matching XCM semantics and provides for an near-trivial mapping.

    +

    UX is the most efficient of the XCM transports.

    +

    +UX Namespace

    +

    The standard UNIX Domain Sockets as defined by POSIX uses the file system as its namespace, with the sockets also being files. However, for simplicity and to avoid situations where stale socket files (originating from crashed processes) causing problems, the UX transport uses a Linux-specific extension, allowing a private UNIX Domain Socket namespace. This is known as the abstract namespace (see the unix(7) man page for details). With the abstract namespace, server socket address allocation has the same life time as TCP ports (i.e. if the process dies, the address is free'd).

    +

    The UX transport enables the SO_PASSCRED BSD socket option, to give the remote peer a name (which UNIX domain connection socket doesn't have by default). This is for debugging and observability purposes. Without a remote peer name, in server processes with multiple incoming connections to the same server socket, it's difficult to say which of the server-side connection sockets goes to which remote peer. The kernel-generated, unique, name is an integer in the form "%05x" (printf format). Applications using hardcoded UX addresses should avoid such names by, for example, using a prefix.

    +

    The UTLS Transport also indirectly uses the UX namespace, so care should be taken to avoid any clashes between UX and UTLS sockets in the same network namespace.

    +

    +UXF Transport

    +

    The UXF transport is identical to the UX transport, only it uses the standard POSIX naming mechanism. The name of a server socket is a file system path, and the socket is also a file.

    +

    The UXF sockets resides in a file system namespace, as opposed to UX sockets, which live in a network namespace.

    +

    Upon xcm_close(), the socket will be closed and the file removed. If an application crashes or otherwise fails to run xcm_close(), it will leave a file in the file system pointing toward a non-existing socket. This file will prevent the creation another server socket with the same name.

    +

    +TCP Transport

    +

    The TCP transport uses the Transmission Control Protocol (TCP), by means of the BSD Sockets API.

    +

    TCP is a byte-stream service, but the XCM TCP transport adds framing on top of the stream. A single-field 32-bit header containing the message length in network byte order is added to every message.

    +

    TCP uses TCP Keepalive to detect lost network connectivity between the peers.

    +

    The TCP transport supports IPv4 and IPv6.

    +

    Since XCM is designed for signaling traffic, the TCP transport disables the Nagle algorithm of TCP to avoid its excessive latency.

    +

    +DNS Socket Attributes

    +

    The TLS transport (and all other TCP protocol-based transports) supports a number of socket attributes controlling DNS-related behavior.

    +

    +DNS Resolution and TCP Connection Establishment

    +

    The DNS resolver used by XCM (either glibc or C-ares) sorts the A and AAAA records retrieved from DNS in an order of preference, before returning them to the caller. In the glibc case, the details of the sorting is a function of the system's configuration (i.e. /etc/gai.conf). In the C-ares case, the sorting is according to RFC 6724 (with some minor deviations).

    +

    By default, XCM will only attempt to connect to the first, most preferred, address in the list of IP addresses provided by the resolver. If that connection attempt fails, the XCM connection establishment procedure will be terminated.

    +

    Using the "dns.algorithm" socket attribute, the application may control the DNS resolution and TCP connection establishment procedure used.

    +

    By default, "dns.algorithm" is set to "single", behaving in accordance to the above description.

    +

    If the algorithm is set to "sequential", all IP addresses will be probed, in a serial manner, in the order provided by the DNS resolver.

    +

    Setting the algorithm to "happy_eyeballs" will result in RFC 6555-like behavior, with two concurrent connection establishment tracks; one attempting to establish an IPv4 connection and the other an IPv6-based connection. The IPv6 track is given a 200 ms head start.

    +

    When the "sequential" or "happy_eyeballs" algorithm is used, only the first 32 addresses provided by the resolver will be considered.

    + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    dns.algorithm Connection String RW The algorithm used for connecting to IP addresses retrieved from DNS. Must take on the value "single", "sequential", or "happy_eyeballs". See DNS Resolution and TCP Connection Establishment for more information. Writable only at the time of the xcm_connect_a() call.
    dns.timeout Connection Double RW The time (in s) until DNS resolution times out. Writable only at the time of the xcm_connect_a() call. The timeout covers the complete DNS resolution process (as opposed to a particular query-response transaction). Only available when the library is built with the c-ares DNS resolver.
    +

    +TCP Socket Attributes

    +

    The read-only TCP attributes are retrieved from the kernel (struct tcp_info in linux/tcp.h).

    +

    Many read-write attributes are mapped directly to setsockopt() calls.

    +

    See the tcp(7) manual page for a more detailed description of these attributes. The struct retrieved with TCP_INFO is the basis for the read-only attributes. The read-write attributes are mapped to TCP_KEEP* and TCP_USER_TIMEOUT.

    +

    Besides the TCP layer attributes, IP- and DNS-level attributes are also listed here.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tcp.rtt Connection Integer R The current TCP round-trip estimate (in us).
    tcp.total_retrans Connection Integer R The total number of retransmitted TCP segments.
    tcp.segs_in Connection Integer R The total number of segments received.
    tcp.segs_out Connection Integer R The total number of segments sent.
    tcp.connect_timeout Connection Double RW The time (in s) until a particular TCP connection establishment attempt times out. Writable only at the time of the xcm_connect_a() call. The default is 3 s. The value of this attribute must be lower than the value of "tcp.user_timeout" to have any effect. Note that if "dns.algorithm" is set to "sequential" or "happy_eyeballs", one xcm_connect_a() call may result in several TCP connection establishment attempts.
    tcp.user_timeout Connection Integer RW The time (in s) before a connection is dropped due to unacknowledged data. The default value is 3 s.
    tcp.keepalive Connection Boolean RW Controls if TCP keepalive is enabled. The default value is true.
    tcp.keepalive_time Connection Integer RW The time (in s) before the first keepalive probe is sent on an idle connection. The default value is 1 s.
    tcp.keepalive_interval Connection Integer RW The time (in s) between keepalive probes. The default value is 1 s.
    tcp.keepalive_count Connection Integer RW The number of keepalive probes sent before the connection is dropped. The default value is 3.
    ipv6.scope All Integer RW The IPv6 scope id used. Only available on IPv6 sockets. Writable only at socket creation. If left unset, it will take on the value of 0 (the global scope). Any other value denotes the network interface index to be used, for IPv6 link local addresses. See the if_nametoindex(3) manual page for how to map interface names to indices.
    +
    Warning
    tcp.segs_in and tcp.segs_out are only present when running XCM on Linux kernel 4.2 or later.
    +

    +TLS Transport

    +

    The TLS transport uses the Transport Layer Security (TLS) protocol to provide a secure, private, two-way authenticated transport over TCP. A TLS connection is a byte stream, but the XCM TLS transport adds framing in the same manner as does the XCM TCP transport.

    +

    The TLS transport supports IPv4 and IPv6. It disables the Nagle algorithm of TCP.

    +

    The TLS transport honors any limitations set by the X.509 extended key usage extension, if present in the remote peer's certificate.

    +

    +TLS Protocol Version and Features

    +

    The TLS transport only employs TLS 1.2 and, if the XCM library is built with OpenSSL 1.1.1 or later, TLS 1.3 as well.

    +

    TLS 1.2 renegotiation is disabled, if the XCM library is built with OpenSSL 1.1.1c or later.

    +

    The TLS transport disables both client and server-side TLS session caching, and thus does not allow for TLS session reuse across TCP connections.

    +

    +Ciphers

    +

    The TLS 1.2 cipher list is (in order of preference, using OpenSSL naming): ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-CHACHA20-POLY1305, DHE-RSA-AES128-GCM-SHA256, DHE-RSA-AES256-GCM-SHA384, and DHE-RSA-CHACHA20-POLY1305.

    +

    The TLS 1.3 cipher suites used are: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256 and TLS_AES_128_GCM_SHA256.

    +

    The TLS cipher lists are neither build- nor run-time configurable.

    +

    +Certificate and Key Handling

    +

    By default, the TLS transport reads the leaf certificate and the corresponding private key from the file system, as well as a file containing all trusted CA certificates. The default file system paths are configured at build-time.

    +

    TLS Socket Attributes may be used to override one or more of the default paths, on a per-socket basis. Paths set on server sockets are inherited by its connection sockets, but may in turn be overriden at the time of an xcm_accept_a() call, using the proper attributes.

    +

    The default paths may also be overriden on a per-process basis by means of setting a UNIX environment variable. The current value of XCM_TLS_CERT (at the time of xcm_connect() or xcm_accept()) determines the certificate directory used for that connection.

    +

    An application may also choose to configure TLS socket credentials by-value, rather than by-file-system-reference. For a particular piece of information, an application must use either supply a file system path (e.g., by setting tls.cert_file) or the actual data (e.g., by passing the certificate data as the value of the tls.cert attribute).

    +

    Setting a credentials by-value attribute in the xcm_attr_map passed to xcm_accept_a() will override the corresponding by-reference attribute in the server socket, and vice versa.

    +

    +Certificate and Key Format

    +

    Certificates (including CRLs) and private keys provided to XCM (either via files or by attribute value) must be in the Privacy-Enhanced Mail (PEM) format (RFC 7468).

    +

    +Per-network Namespace Certificates

    +

    The TLS transport will, at the time of xcm_connect() or xcm_server(), look up the process' current network namespace, unless that file's path was given as a TLS Socket Attributes. If the namespace is given a name per the iproute2 convention, XCM will retrieve this name and use it in the certificate and key lookup.

    +

    In case the certificate, key and trusted CA files are configured using TLS Socket Attributes, no network namespace lookup will be performed.

    +

    In the certificate directory (either the compile-time default, or the directory specified with XCM_TLS_CERT), the TLS transport expects the files to follow the following naming conventions (where <ns> is the namespace):

    cert_<ns>.pem
    +

    The private key is stored in:

    key_<ns>.pem
    +

    The trusted CA certificates are stored in:

    tc_<ns>.pem
    +

    The certification revocation lists (CRLs) are stored in:

    crl_<ns>.pem
    +

    +Default Namespace Certificates

    +

    For the default namespace (or rather, any network namespace not named according to iproute2 standards), the certificate need to be stored in a file "cert.pem" and the private key in "key.pem".

    +

    If authentication is enabled (which it is, by default), the trusted CA certificates need to be stored in a file named "tc.pem".

    +

    If CRL checking is enabled (which it is not, by default), the CRLs need to be stored in a file named "crl.pem".

    +

    In case the appropriate credential-related files are not in place (for a particular namespace), an xcm_server() call will return an error and set errno to EPROTO. The application may choose to retry at a later time.

    +

    If authentication is disabled, "tc.pem" need not be present, and vice versa. The same applies to CRL checking and "crl.pem" availability.

    +

    +Runtime Certificate File Updates

    +

    In case a certificate, private key, or trusted CAs file is modified, the new version of the file(s) will be used by new connections. Such a change does not affect already-established connections. The TLS transport works with differences between set of files, and thus the new generation of files need not nesserarily be newer (as in having a more recent file system mtime).

    +

    The certificate, key and trusted CA certificates should be updated in an atomic manner, or XCM may end up using the certificate file from one generation of files and the key file from another, for example.

    +

    One way of achieving an atomic update is to have the three files in a common directory. This certificate directory is then made a symbolic link to the directory where the actual files are located. Upon update, a new directory is created and populated, and the old symbolic link is replace an atomic manner (i.e. with rename(2)).

    +

    +Role Configuration

    +

    By default, on sockets that represent the client side of an XCM TLS connection (e.g., returned from xcm_connect_a()), the XCM TLS transport will act as a TLS client. Similarly, the default behavior for sockets representing the XCM (and TCP) server side of a connection is to act as a TLS server.

    +

    The default may be changed by setting the "tls.client" attribute, so that sockets that are XCM (and TCP) level clients, act as TLS servers, and vice versa. If the value is true, the socket will act as a TLS client, and if false, the socket is a TLS server.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.client" attribute value from their parent server sockets.

    +

    The TLS role must be specified at the time of socket creation, and thus cannot be changed on already-established connections.

    +

    +Authentication

    +

    By default, both the client and server side authenticate the other peer, often referred to as mutual TLS (mTLS).

    +

    TLS remote peer authentication may be disabled by setting the "tls.auth" socket attribute to false. The default value is true.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.auth" attribute value from their parent server sockets.

    +

    The "tls.auth" socket attribute may only be set at the time of socket creation (except for server sockets).

    +

    +X.509v3 Subject Name Verification

    +

    The TLS transport supports verifying the remote peer's certificate subject name against an application-specified expected name, or a set of names. "Subject name" here is used as per RFC 6125 definition, and is either a Distingushed Name (DN) of the X.509 certificate's subject field, or a DNS type subject alternative name extension. XCM does not make any distinction between the two.

    +

    Subject name verification may be enabled by setting the "tls.verify_peer_name" socket attribute to true. It is disabled by default.

    +

    If enabled, XCM will verify the hostname in the address supplied in the xcm_connect_a() call. In case the attribute "tls.peer_names" is also supplied, it overrides this behavior. The value of this attribute is a ':'-separated set of subject names. "tls.peer_names" may not be set unless "tls.verify_peer_name" is set to true.

    +

    If there is a non-zero overlap between these two sets, the verification is considered successful. The actual procedure is delegated to OpenSSL. Wildcard matching is disabled (X509_CHECK_FLAG_NO_WILDCARDS) and the check includes the subject field (X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT).

    +

    Subject name verification may be used both by a client (in its xcm_connect_a() call) or by a server (in xcm_server_a() or xcm_accept_a()). "tls.peer_names" must be specified in case "tls.verify_peer_name" is set to true on connection sockets created by accepting a TLS connection from a server socket (since there is no hostname to fall back to).

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.verify_name" and "tls.peer_names" attributes from their parent server sockets.

    +

    After a connection is established, the "tls.peer_names" will be updated to reflect the remote peer's actual subject names, as opposed to those which were originally allowed.

    +

    OpenSSL refers to this functionality as hostname validation, and that is also how it's usually used. However, the subject name passed in "tls.peer_names" need not be DNS domain name, but can be any kind of name or identifier. All names must follow DNS domain name syntax rules (including label and total length limitations). Also, while uppercase and lowercase letters are allowed in domain names, no significance is attached to the case.

    +

    +Certification Revocation List Checks

    +

    The XCM TLS transport may be asked to perform checks against one or more Certificate Revocation Lists (CRLs).

    +

    CRL checking is enabled by setting the "tls.check_crl" socket attribute to true during socket creation (e.g., when calling xcm_connect_a()). CRL checking is disabled by default. CRL checking may be employed by both TLS client and server endpoints.

    +

    The default CRL file location may be overriden using the "tls.crl_file" attribute. Alternatively, the CRL data may be provided by-value using the "tls.crl" attribute.

    +

    The CRL bundle must be in PEM format, and must be present and valid if CRL checking is enabled.

    +

    The full chain is checked against the user-provided CRLs (i.e., in OpenSSL terms, both the X509_V_FLAG_CRL_CHECK and X509_V_FLAG_CRL_CHECK_ALL flags are set).

    +

    CRL checking is only meaningful (and allowed) when authentication is enabled.

    +

    Due to a bug in OpenSSL, partial chains (i.e., where the trust anchor is a trusted non-root certificate) is not allowed when CRL checking is enabled. In OpenSSL terms, X509_V_FLAG_PARTIAL_CHAIN is disabled when X509_V_FLAG_CRL_CHECK_ALL is enabled. Future versions of XCM, built against newer versions of OpenSSL, may allow partial chains in combination with CRL checking.

    +

    +Certificate Validity Period Checks

    +

    By default, the XCM TLS transport checks the validity period of each X.509 certificate in the chain of trust, down to and including the remote peer's leaf certificate, against the current system time. If any certificate is found to be either not yet valid or expired, TLS connection establishment is aborted.

    +

    A socket may be configured to accept not-yet-valid certificates and expired certificates by setting the "tls.check_time" to false.

    +

    Connection sockets created by xcm_accept() or xcm_accept_a() inherit the "tls.check_time" attribute value from their parent server sockets.

    +

    +TLS Socket Attributes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Attribute Name Socket Type Value Type Mode Description
    tls.cert_file All String RW The leaf certificate file. Writable only at socket creation.
    tls.key_file All String RW The leaf certificate private key file. Writable only at socket creation.
    tls.tc_file All String RW The trusted CA certificates bundle file. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl_file Al l String RW The certificate verification list (CRL) bundle. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.cert All Binary RW The leaf certificate to be used. Writable only at socket creation.
    tls.key All Binary RW The leaf certificate private key to be used. Writable only at socket creation. For security reasons, the value of this attribute is not available over the XCM control interface.
    tls.tc All Binary RW The trusted CA certificates bundle to be used. Writable only at socket creation. May not be set if authentication is disabled.
    tls.crl All Binary RW The certificate verification list (CRL) bundle to be used. Writable only at socket creation. May only be set if CRL checking is enabled.
    tls.client All Boolean RW Controls whether to act as a TLS-level client or a server. Writable only at socket creation.
    tls.auth All Boolean RW Controls whether or not to authenticate the remote peer. Writable only at socket creation. Default value is true.
    tls.check_crl All Boolean RW Controls whether or not to perform CRL checking. Writable only at socket creation. Default value is false.
    tls.check_time All Boolean RW Controls if the X.509 certificate validity period is honored. Writable only at socket creation. Default is true.
    tls.verify_peer_name All Boolean RW Controls if subject name verification should be performed. Writable only at socket creation. Default value is false.
    tls.peer_names All String RW At socket creation, a list of acceptable peer subject names. After connection establishment, a list of actual peer subject names. Writable only at socket creation.
    tls.peer_subject_key_id Connection String R The X509v3 Subject Key Identifier of the remote peer, or a zero-length string in case no certificate available (e.g, the TLS connection is not established or TLS authentication is disabled and the remote peer did not send a certificate).
    +

    In addition to the TLS-specific attributes, a TLS socket also has all the DNS Socket Attributes and TCP Socket Attributes (including the IP-level attributes).

    +

    +UTLS Transport

    +

    The UTLS transport provides a hybrid transport, utilizing both the TLS and UX transports internally for actual connection establishment and message delivery.

    +

    On the client side, at the time of xcm_connect(), the UTLS transport determines if the server socket can be reached by using the UX transport (i.e. if the server socket is located on the same OS instance, in the same network namespace). If not, UTLS will attempt to reach the server by means of the TLS transport.

    +

    For a particular UTLS connection, either TLS or UX is used (never both). XCM connections to a particular UTLS server socket may be a mix of the two different types.

    +

    For an UTLS server socket with the address utls:<ip>:<port>, two underlying addresses will be allocated; tls:<ip>:<port> and ux:<ip>:<port>.

    +

    In case DNS is used: tls:<hostname>:<port> and ux:<hostname>:<port>.

    +

    +UTLS Socket Attributes

    +

    UTLS sockets accept all the TLS Socket Attributes, as well as the Generic Attributes. In case a UTLS connection is being established as a UX connection socket, all TLS attributes are ignored.

    +

    +UTLS Limitations

    +

    A wildcard should never be used when creating a UTLS server socket.

    +

    If a DNS hostname is used in place of the IP address, both the client and server need employ DNS, and also agree upon which hostname to use (in case there are several pointing at the same IP address).

    +

    Failure to adhere to the above two rules will prevent a client from finding a local server. Such a client will instead establish a TLS connection to the server.

    +

    +SCTP Transport

    +

    The SCTP transport uses the Stream Control Transmission Protocol (SCTP). SCTP provides a reliable, message-oriented service. In-order delivery is optional, but to adhere to XCM semantics (and for other reasons) XCM leaves SCTP in-order delivery enabled.

    +

    The SCTP transport utilizes the native Linux kernel's implementation of SCTP, via the BSD Socket API. The operating mode is such that there is a 1:1-mapping between an association and a socket (fd).

    +

    The SCTP transport supports IPv4 and IPv6.

    +

    To minimize latency, the SCTP transport disables the Nagle algorithm.

    +

    +BTCP Transport

    +

    The BTCP transport provides a reliable two-way byte stream service over TCP.

    +

    Unlike the TCP Transport, BTCP doesn't use a framing header or anything else on the wire protocol level that is specific to XCM. In other words, it's a "raw" TCP connection.

    +

    Other than the above-mentioned differences, BTCP is identical to the TCP Transport, including supported DNS Socket Attributes and TCP Socket Attributes.

    +

    +BTLS Transport

    +

    The BTLS transport provides a direct mapping to the Transport Layer Security (TLS) protocol over TCP. It provides a secure, private, two-way authenticated byte stream service.

    +

    BTLS has the same relationship to the TLS Transport as the TCP Transport has to the TCP Transport.

    +

    BTLS doesn't add a framing header or any other XCM BTLS-level protocol artefacts on top of the TLS session. In other words, it's a "raw" TLS connection.

    +

    Other than providing a byte stream, it's identical to the TLS Transport, including supported DNS Socket Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    +Linux Network and IPC Namespaces

    +

    Namespaces is a Linux kernel facility concept for creating multiple, independent namespaces for kernel resources of a certain kind.

    +

    Linux Network Namespaces will affect all transports, except the UXF Transport.

    +

    XCM has no explicit namespace support. Rather, the application is expected to use the Linux kernel facilities for this functionality (i.e. switch to the right namespace before xcm_server() och xcm_connect()).

    +

    In case the system follows the iproute2 conventions in regards to network namespace naming, the TLS and UTLS transports support per-network namespace TLS certificates and private keys.

    +

    +Tracing

    +

    In case XCM is built with LTTng support, the XCM library will register two tracepoints: com_ericsson_xcm:xcm_debug and com_ericsson_xcm:xcm_error. The xcm_debug is verbose indeed, while messages on xcm_error are rare indeed. The latter is mostly due to the fact there are very few conditions that the library reliable can classify as errors, since many "errors" [e.g., connection refused] may well be the expected result).

    +

    If the XCM_DEBUG environment variable is set, the same trace messages that are routed via the LTTng tracepoints, are printed to stderr of the process linked to the library.

    +

    The tracepoint names and the format of the messages are subject to change, and not to be considered a part of the XCM API.

    +
    +
    + + + + diff --git a/doc/v1.9.2/inline_umlgraph_pnghtml.pu b/doc/v1.9.2/inline_umlgraph_pnghtml.pu new file mode 100644 index 000000000..3d9fdf388 --- /dev/null +++ b/doc/v1.9.2/inline_umlgraph_pnghtml.pu @@ -0,0 +1,105 @@ +@startuml nb_connect_and_send.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 42 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(43, [42, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "hello world", 11); +libxcm -> client: 0 +@enduml +@startuml nb_connect_explicit.png +client -> libxcm: xcm_connect("tls:192.168.1.42:4711", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 99 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libc: select(116, [99, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_immediate_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: NULL, errno=ECONNREFUSED +@enduml +@startuml nb_delayed_connection_refused.png +client -> libxcm: xcm_connect("utls:192.168.1.17:17", XCM_NONBLOCK); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 100 +client -> libxcm: xcm_await(conn_socket, XCM_SO_SENDABLE); +libxcm -> client: 0 +client -> libc: select(101, [100, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_send(conn_socket, "Greetings from the North", 25); +libxcm -> client: -1, errno=ECONNREFUSED +client -> libxcm: xcm_close(conn_socket); +libxcm -> client: 0 +@enduml +@startuml nb_flush_buffers_before_close.png +client -> libxcm: xcm_send(conn_socket, msg, 100); +libxcm -> client: 0 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client: -1, errno=EAGAIN +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 12 +client -> libxcm: xcm_await(conn_socket, 0); +libxcm -> client: 0 +client -> libc: select(13, [12, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_finish(conn_socket); +libxcm -> client : 0 +client -> libxcm: xcm_close(conn_socket); +libxcm -> client : 0 +@enduml +@startuml server_accept.png +client -> libxcm: xcm_server("tcp:*:17"); +libxcm -> client: server_socket +client -> libxcm: xcm_set_blocking(server_socket, false); +libxcm -> client: 0 +client -> libxcm: xcm_fd(server_socket); +libxcm -> client: 4 +client -> libxcm: xcm_await(server_socket, XCM_SO_ACCEPTABLE); +libxcm -> client: 0 +client -> libc: select(5, [4, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> libxcm: xcm_accept(server_socket); +libxcm -> client: conn_socket +client -> libxcm: xcm_fd(conn_socket); +libxcm -> client: 5 +client -> libxcm: xcm_await(conn_socket, XCM_SO_RECEIVABLE); +libxcm -> client: 0 +client -> libc: select(6, [4, 5, ...], [...], [...], NULL); +||| +libc -> client: 1 +client -> client: map_active_fd_to_xcm_socket() +client -> libxcm: xcm_receive(conn_socket, buf, 1024); +libxcm -> client: 100 +client -> client: handle_request(buf, 100); +@enduml diff --git a/doc/v1.9.2/jquery.js b/doc/v1.9.2/jquery.js new file mode 100644 index 000000000..1dffb65b5 --- /dev/null +++ b/doc/v1.9.2/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/doc/v1.9.2/menu.js b/doc/v1.9.2/menu.js new file mode 100644 index 000000000..b0b26936a --- /dev/null +++ b/doc/v1.9.2/menu.js @@ -0,0 +1,136 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+='
      '; + for (var i in data.children) { + var url; + var link; + link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + var searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + var $mainMenuState = $('#main-menu-state'); + var prevWidth = 0; + if ($mainMenuState.length) { + function initResizableIfExists() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function(e) { + var $menu = $('#main-menu'); + var options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = function() { $menu.css('display', 'block') }; + $menu.hide().slideDown(options); + } else { + options['complete'] = function() { $menu.css('display', 'none') }; + $menu.show().slideUp(options); + } + }); + // set default menu visibility + function resetState() { + var $menu = $('#main-menu'); + var $mainMenuState = $('#main-menu-state'); + var newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/doc/v1.9.2/menudata.js b/doc/v1.9.2/menudata.js new file mode 100644 index 000000000..5a502c197 --- /dev/null +++ b/doc/v1.9.2/menudata.js @@ -0,0 +1,44 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"x",url:"globals.html#index_x"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"x",url:"globals_func.html#index_x"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Enumerator",url:"globals_eval.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/doc/v1.9.2/minus.svg b/doc/v1.9.2/minus.svg new file mode 100644 index 000000000..f70d0c1a1 --- /dev/null +++ b/doc/v1.9.2/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.9.2/minusd.svg b/doc/v1.9.2/minusd.svg new file mode 100644 index 000000000..5f8e87962 --- /dev/null +++ b/doc/v1.9.2/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/v1.9.2/nav_f.png b/doc/v1.9.2/nav_f.png new file mode 100644 index 000000000..72a58a529 Binary files /dev/null and b/doc/v1.9.2/nav_f.png differ diff --git a/doc/v1.9.2/nav_fd.png b/doc/v1.9.2/nav_fd.png new file mode 100644 index 000000000..032fbdd4c Binary files /dev/null and b/doc/v1.9.2/nav_fd.png differ diff --git a/doc/v1.9.2/nav_g.png b/doc/v1.9.2/nav_g.png new file mode 100644 index 000000000..2093a237a Binary files /dev/null and b/doc/v1.9.2/nav_g.png differ diff --git a/doc/v1.9.2/nav_h.png b/doc/v1.9.2/nav_h.png new file mode 100644 index 000000000..33389b101 Binary files /dev/null and b/doc/v1.9.2/nav_h.png differ diff --git a/doc/v1.9.2/nav_hd.png b/doc/v1.9.2/nav_hd.png new file mode 100644 index 000000000..de80f18ad Binary files /dev/null and b/doc/v1.9.2/nav_hd.png differ diff --git a/doc/v1.9.2/nb_connect_and_send.png b/doc/v1.9.2/nb_connect_and_send.png new file mode 100644 index 000000000..ec94eb015 Binary files /dev/null and b/doc/v1.9.2/nb_connect_and_send.png differ diff --git a/doc/v1.9.2/nb_connect_explicit.png b/doc/v1.9.2/nb_connect_explicit.png new file mode 100644 index 000000000..a5df8f3b6 Binary files /dev/null and b/doc/v1.9.2/nb_connect_explicit.png differ diff --git a/doc/v1.9.2/nb_delayed_connection_refused.png b/doc/v1.9.2/nb_delayed_connection_refused.png new file mode 100644 index 000000000..5c216bb18 Binary files /dev/null and b/doc/v1.9.2/nb_delayed_connection_refused.png differ diff --git a/doc/v1.9.2/nb_flush_buffers_before_close.png b/doc/v1.9.2/nb_flush_buffers_before_close.png new file mode 100644 index 000000000..5ad732597 Binary files /dev/null and b/doc/v1.9.2/nb_flush_buffers_before_close.png differ diff --git a/doc/v1.9.2/nb_immediate_connection_refused.png b/doc/v1.9.2/nb_immediate_connection_refused.png new file mode 100644 index 000000000..8c50459ae Binary files /dev/null and b/doc/v1.9.2/nb_immediate_connection_refused.png differ diff --git a/doc/v1.9.2/open.png b/doc/v1.9.2/open.png new file mode 100644 index 000000000..30f75c7ef Binary files /dev/null and b/doc/v1.9.2/open.png differ diff --git a/doc/v1.9.2/plus.svg b/doc/v1.9.2/plus.svg new file mode 100644 index 000000000..075201655 --- /dev/null +++ b/doc/v1.9.2/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.9.2/plusd.svg b/doc/v1.9.2/plusd.svg new file mode 100644 index 000000000..0c65bfe94 --- /dev/null +++ b/doc/v1.9.2/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/doc/v1.9.2/search/all_0.js b/doc/v1.9.2/search/all_0.js new file mode 100644 index 000000000..0ca29da8b --- /dev/null +++ b/doc/v1.9.2/search/all_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_1.js b/doc/v1.9.2/search/all_1.js new file mode 100644 index 000000000..70206c175 --- /dev/null +++ b/doc/v1.9.2/search/all_1.js @@ -0,0 +1,25 @@ +var searchData= +[ + ['accept_0',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['addr_1',['addr',['../structxcm__addr__ip.html#a417699809e0c51d5d2395f6490ab3729',1,'xcm_addr_ip']]], + ['address_20format_2',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['address_20syntax_3',['Address Syntax',['../index.html#address_syntax',1,'']]], + ['addresses_4',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['addressing_20and_20transport_20selection_5',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['and_20byte_20streams_6',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['and_20features_7',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['and_20fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['and_20ipc_20namespaces_9',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['and_20key_20format_10',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['and_20key_20handling_11',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['and_20receive_12',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['and_20send_20message_13',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['and_20tcp_20connection_20establishment_14',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['and_20transport_20selection_15',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['api_16',['Control API',['../index.html#ctl_api',1,'']]], + ['api_20version_17',['API Version',['../group__api__version.html',1,'']]], + ['attribute_20inheritance_18',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['attribute_20maps_19',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['attributes_20',['attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#xcm_attr',1,'Generic Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['authentication_21',['Authentication',['../index.html#tls_auth',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_10.js b/doc/v1.9.2/search/all_10.js new file mode 100644 index 000000000..396d2fba8 --- /dev/null +++ b/doc/v1.9.2/search/all_10.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['ready_20status_20semantics_0',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['receive_1',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['refused_2',['refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['resolution_3',['DNS Resolution',['../index.html#dns',1,'']]], + ['resolution_20and_20tcp_20connection_20establishment_4',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['role_20configuration_6',['Role Configuration',['../index.html#tls_role',1,'']]], + ['runtime_20certificate_20file_20updates_7',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_11.js b/doc/v1.9.2/search/all_11.js new file mode 100644 index 000000000..482e3e761 --- /dev/null +++ b/doc/v1.9.2/search/all_11.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['safety_0',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['sctp_20transport_1',['SCTP Transport',['../index.html#sctp_transport',1,'']]], + ['selection_2',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['semantics_3',['semantics',['../index.html#semantics',1,'Overall Semantics'],['../index.html#might_block',1,'Ready Status Semantics']]], + ['send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['send_20message_5',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['sequences_6',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['server_20accept_7',['Server Accept',['../index.html#nb_server_accept',1,'']]], + ['socket_20attributes_8',['socket attributes',['../index.html#dns_attr',1,'DNS Socket Attributes'],['../index.html#attributes',1,'Socket Attributes'],['../index.html#tcp_attr',1,'TCP Socket Attributes'],['../index.html#tls_attr',1,'TLS Socket Attributes'],['../index.html#utls_attr',1,'UTLS Socket Attributes']]], + ['socket_20directory_9',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['status_20semantics_10',['Ready Status Semantics',['../index.html#might_block',1,'']]], + ['streams_11',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['subject_20name_20verification_12',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['support_13',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['supported_20i_20o_20multiplexing_20facilities_14',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['syntax_15',['Address Syntax',['../index.html#address_syntax',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_12.js b/doc/v1.9.2/search/all_12.js new file mode 100644 index 000000000..3b4dfe690 --- /dev/null +++ b/doc/v1.9.2/search/all_12.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['tasks_0',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['tcp_20connection_20establishment_1',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['tcp_20socket_20attributes_2',['TCP Socket Attributes',['../index.html#tcp_attr',1,'']]], + ['tcp_20transport_3',['TCP Transport',['../index.html#tcp_transport',1,'']]], + ['thread_20safety_4',['Thread Safety',['../index.html#thread_safety',1,'']]], + ['tls_20protocol_20version_20and_20features_5',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['tls_20socket_20attributes_6',['TLS Socket Attributes',['../index.html#tls_attr',1,'']]], + ['tls_20transport_7',['TLS Transport',['../index.html#tls_transport',1,'']]], + ['tracing_8',['Tracing',['../index.html#tracing',1,'']]], + ['transport_9',['transport',['../index.html#btcp_transport',1,'BTCP Transport'],['../index.html#btls_transport',1,'BTLS Transport'],['../index.html#sctp_transport',1,'SCTP Transport'],['../index.html#tcp_transport',1,'TCP Transport'],['../index.html#tls_transport',1,'TLS Transport'],['../index.html#utls_transport',1,'UTLS Transport'],['../index.html#ux_transport',1,'UX Transport'],['../index.html#uxf_transport',1,'UXF Transport']]], + ['transport_20selection_10',['Addressing and Transport Selection',['../index.html#addressing',1,'']]], + ['transports_11',['Transports',['../index.html#transports',1,'']]], + ['type_12',['type',['../structxcm__addr__host.html#a8bc4963637da5fc219f55c4023ab2951',1,'xcm_addr_host']]] +]; diff --git a/doc/v1.9.2/search/all_13.js b/doc/v1.9.2/search/all_13.js new file mode 100644 index 000000000..f2bee6888 --- /dev/null +++ b/doc/v1.9.2/search/all_13.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['unix_20socket_20directory_0',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['updates_1',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['utls_20limitations_2',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['utls_20socket_20attributes_3',['UTLS Socket Attributes',['../index.html#utls_attr',1,'']]], + ['utls_20transport_4',['UTLS Transport',['../index.html#utls_transport',1,'']]], + ['ux_20namespace_5',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['ux_20transport_6',['UX Transport',['../index.html#ux_transport',1,'']]], + ['uxf_20transport_7',['UXF Transport',['../index.html#uxf_transport',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_14.js b/doc/v1.9.2/search/all_14.js new file mode 100644 index 000000000..1348c945b --- /dev/null +++ b/doc/v1.9.2/search/all_14.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['validity_20period_20checks_0',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['verification_1',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['version_2',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]], + ['version_20and_20features_3',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_15.js b/doc/v1.9.2/search/all_15.js new file mode 100644 index 000000000..c524b351d --- /dev/null +++ b/doc/v1.9.2/search/all_15.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['with_20explicit_20finish_0',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_16.js b/doc/v1.9.2/search/all_16.js new file mode 100644 index 000000000..3c9d9cbf8 --- /dev/null +++ b/doc/v1.9.2/search/all_16.js @@ -0,0 +1,111 @@ +var searchData= +[ + ['x_20509v3_20subject_20name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['xcm_2eh_1',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faccept_2',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_3',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_2eh_4',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5faddr_5fhost_5',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_6',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]], + ['xcm_5faddr_5fmake_5fbtcp_7',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_8',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_9',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_10',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_11',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_12',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_13',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_14',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_15',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_16',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_17',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_18',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_19',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_20',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_21',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_22',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_23',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_2eh_24',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fcb_25',['xcm_attr_cb',['../xcm__attr_8h.html#ae80e4e258f7b0593c8397a1d6374bebf',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_26',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_27',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_28',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_29',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_30',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_31',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_32',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_2eh_33',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5fmap_5fadd_34',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_35',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_36',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_37',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_38',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_39',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_40',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_41',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_42',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_43',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_44',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_45',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_46',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_47',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_5fcb_48',['xcm_attr_map_foreach_cb',['../xcm__attr__map_8h.html#acf4127faaf9d3e8bfec08cb0045ab5c8',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_49',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_50',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_51',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_52',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_53',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_54',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_55',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_56',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_57',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_58',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_59',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_60',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fattr_5ftype_61',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbin_62',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_63',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_64',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_65',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_66',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftypes_2eh_67',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fawait_68',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fbtcp_5fproto_69',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_70',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5fcleanup_71',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_72',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fcompat_2eh_73',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fconnect_74',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_75',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_76',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffd_5fexception_77',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_78',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_79',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5ffinish_80',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_81',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_82',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5fnonblock_83',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5freceive_84',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_85',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_86',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fsend_87',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_88',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_89',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_90',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fso_5facceptable_91',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_92',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_93',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_94',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_95',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_96',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_97',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_98',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]], + ['xcm_5fversion_99',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version(void): xcm_version.h'],['../group__lib__version.html#gaadb0a0ca7a39657f8b1002fffa72190a',1,'XCM_VERSION: xcm_version.h']]], + ['xcm_5fversion_2eh_100',['xcm_version.h',['../xcm__version_8h.html',1,'']]], + ['xcm_5fversion_5fapi_101',['xcm_version_api',['../group__api__version.html#ga9dd4982f6b09ae68d5358e3aa3826a48',1,'XCM_VERSION_API: xcm_version.h'],['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version_api(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_102',['xcm_version_api_major',['../group__api__version.html#ga256bdc3c1c2d715c7a22c1e7e36779b6',1,'XCM_VERSION_API_MAJOR: xcm_version.h'],['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version_api_major(void): xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_103',['xcm_version_api_minor',['../group__api__version.html#gae89d6ebc954db2113486bba8986effd4',1,'XCM_VERSION_API_MINOR: xcm_version.h'],['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version_api_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fmajor_104',['xcm_version_major',['../group__lib__version.html#ga3b511d743cca4eab2aa3536aa798a9de',1,'XCM_VERSION_MAJOR: xcm_version.h'],['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version_major(void): xcm_version.h']]], + ['xcm_5fversion_5fminor_105',['xcm_version_minor',['../group__lib__version.html#gaf2ef9879741fa10065fa849e4a3cd7ec',1,'XCM_VERSION_MINOR: xcm_version.h'],['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version_minor(void): xcm_version.h']]], + ['xcm_5fversion_5fpatch_106',['xcm_version_patch',['../group__lib__version.html#gabc2e99728d72a02693cda73a263c337a',1,'XCM_VERSION_PATCH: xcm_version.h'],['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version_patch(void): xcm_version.h']]], + ['xcm_5fwant_107',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.2/search/all_2.js b/doc/v1.9.2/search/all_2.js new file mode 100644 index 000000000..6f594310c --- /dev/null +++ b/doc/v1.9.2/search/all_2.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['before_20close_0',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['blocking_20connection_20establishment_1',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['blocking_20example_20sequences_2',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['blocking_20operation_3',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['blocking_20send_20and_20receive_4',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]], + ['btcp_20transport_5',['BTCP Transport',['../index.html#btcp_transport',1,'']]], + ['btls_20transport_6',['BTLS Transport',['../index.html#btls_transport',1,'']]], + ['buffer_20flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['byte_20counter_20attributes_8',['Byte Counter Attributes',['../index.html#common_cnt_attr',1,'']]], + ['byte_20streams_9',['Messaging and Byte Streams',['../index.html#service_types',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_3.js b/doc/v1.9.2/search/all_3.js new file mode 100644 index 000000000..61125c0c2 --- /dev/null +++ b/doc/v1.9.2/search/all_3.js @@ -0,0 +1,26 @@ +var searchData= +[ + ['certificate_20and_20key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['certificate_20and_20key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]], + ['certificate_20file_20updates_2',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['certificate_20validity_20period_20checks_3',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['certificates_4',['certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['certification_20revocation_20list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['checks_6',['checks',['../index.html#validity_checks',1,'Certificate Validity Period Checks'],['../index.html#crl_checks',1,'Certification Revocation List Checks']]], + ['ciphers_7',['Ciphers',['../index.html#tls_ciphers',1,'']]], + ['close_8',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['command_20line_20control_20program_9',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['configuration_10',['Role Configuration',['../index.html#tls_role',1,'']]], + ['connect_20and_20send_20message_11',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['connect_20with_20explicit_20finish_12',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['connection_20establishment_13',['connection establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['connection_20oriented_20messaging_14',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['connection_20refused_15',['connection refused',['../index.html#nb_delayed_connection_refused',1,'Delayed Connection Refused'],['../index.html#nb_immediate_connection_refused',1,'Immediate Connection Refused']]], + ['control_16',['Flow Control',['../index.html#flow_control',1,'']]], + ['control_20api_17',['Control API',['../index.html#ctl_api',1,'']]], + ['control_20interface_18',['Control Interface',['../index.html#ctl',1,'']]], + ['control_20interface_20error_20handling_19',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['control_20program_20',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['control_20unix_20socket_20directory_21',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['counter_20attributes_22',['counter attributes',['../index.html#common_cnt_attr',1,'Byte Counter Attributes'],['../index.html#cnt_attr',1,'Generic Counter Attributes'],['../index.html#messaging_cnt_attr',1,'Message Counter Attributes']]] +]; diff --git a/doc/v1.9.2/search/all_4.js b/doc/v1.9.2/search/all_4.js new file mode 100644 index 000000000..883778f45 --- /dev/null +++ b/doc/v1.9.2/search/all_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['dead_20peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['default_20namespace_20certificates_1',['Default Namespace Certificates',['../index.html#default_certs',1,'']]], + ['delayed_20connection_20refused_2',['Delayed Connection Refused',['../index.html#nb_delayed_connection_refused',1,'']]], + ['detection_3',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['directory_4',['Control UNIX Socket Directory',['../index.html#ctl_dir',1,'']]], + ['dns_20resolution_5',['DNS Resolution',['../index.html#dns',1,'']]], + ['dns_20resolution_20and_20tcp_20connection_20establishment_6',['DNS Resolution and TCP Connection Establishment',['../index.html#dns_algorithm_attr',1,'']]], + ['dns_20socket_20attributes_7',['DNS Socket Attributes',['../index.html#dns_attr',1,'']]], + ['driven_20programming_20support_8',['Event-driven Programming Support',['../index.html#select',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_5.js b/doc/v1.9.2/search/all_5.js new file mode 100644 index 000000000..b7918e4b7 --- /dev/null +++ b/doc/v1.9.2/search/all_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['error_20handling_0',['error handling',['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]], + ['establishment_1',['establishment',['../index.html#dns_algorithm_attr',1,'DNS Resolution and TCP Connection Establishment'],['../index.html#non_blocking_connect',1,'Non-blocking Connection Establishment']]], + ['event_20driven_20programming_20support_2',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['example_20sequences_3',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['explicit_20finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['extensible_20connection_20oriented_20messaging_5',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_6.js b/doc/v1.9.2/search/all_6.js new file mode 100644 index 000000000..4d4ff5674 --- /dev/null +++ b/doc/v1.9.2/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['family_1',['family',['../structxcm__addr__ip.html#a7dfb8591b5f4b11467052f300dd46b1d',1,'xcm_addr_ip']]], + ['features_2',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]], + ['file_20updates_3',['Runtime Certificate File Updates',['../index.html#cert_update',1,'']]], + ['finish_4',['Connect with Explicit Finish',['../index.html#nb_connect_explicit',1,'']]], + ['finishing_20outstanding_20tasks_5',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['flow_20control_6',['Flow Control',['../index.html#flow_control',1,'']]], + ['flush_20before_20close_7',['Buffer Flush Before Close',['../index.html#nb_flush_buffers_before_close',1,'']]], + ['fork_8',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['format_9',['format',['../index.html#credentials_format',1,'Certificate and Key Format'],['../index.html#ip_addr_format',1,'IPv4 Address Format']]] +]; diff --git a/doc/v1.9.2/search/all_7.js b/doc/v1.9.2/search/all_7.js new file mode 100644 index 000000000..f2c73eefa --- /dev/null +++ b/doc/v1.9.2/search/all_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['generic_20attributes_0',['Generic Attributes',['../index.html#xcm_attr',1,'']]], + ['generic_20counter_20attributes_1',['Generic Counter Attributes',['../index.html#cnt_attr',1,'']]], + ['guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_8.js b/doc/v1.9.2/search/all_8.js new file mode 100644 index 000000000..e22d51cad --- /dev/null +++ b/doc/v1.9.2/search/all_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['handling_0',['handling',['../index.html#tls_certificates',1,'Certificate and Key Handling'],['../index.html#ctl_errors',1,'Control Interface Error Handling'],['../index.html#error_handling',1,'Error Handling']]] +]; diff --git a/doc/v1.9.2/search/all_9.js b/doc/v1.9.2/search/all_9.js new file mode 100644 index 000000000..0269925d1 --- /dev/null +++ b/doc/v1.9.2/search/all_9.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['i_20o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['immediate_20connection_20refused_1',['Immediate Connection Refused',['../index.html#nb_immediate_connection_refused',1,'']]], + ['inheritance_2',['Attribute Inheritance',['../index.html#xcm_attr_inheritance',1,'']]], + ['interface_3',['Control Interface',['../index.html#ctl',1,'']]], + ['interface_20error_20handling_4',['Control Interface Error Handling',['../index.html#ctl_errors',1,'']]], + ['introduction_5',['Introduction',['../index.html#introduction',1,'']]], + ['ip4_6',['ip4',['../structxcm__addr__ip.html#ae83efededa397946e338d0565c17f0f2',1,'xcm_addr_ip']]], + ['ip6_7',['ip6',['../structxcm__addr__ip.html#ad440402f9bf95ea6ab0b4d61784949f1',1,'xcm_addr_ip']]], + ['ipc_20namespaces_8',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['ipv4_20address_20format_9',['IPv4 Address Format',['../index.html#ip_addr_format',1,'']]], + ['ipv6_20link_20local_20addresses_10',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_a.js b/doc/v1.9.2/search/all_a.js new file mode 100644 index 000000000..870de0ce4 --- /dev/null +++ b/doc/v1.9.2/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['key_20format_0',['Certificate and Key Format',['../index.html#credentials_format',1,'']]], + ['key_20handling_1',['Certificate and Key Handling',['../index.html#tls_certificates',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_b.js b/doc/v1.9.2/search/all_b.js new file mode 100644 index 000000000..fb7fa7f73 --- /dev/null +++ b/doc/v1.9.2/search/all_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]], + ['limitations_1',['UTLS Limitations',['../index.html#utls_limitations',1,'']]], + ['line_20control_20program_2',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['link_20local_20addresses_3',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]], + ['linux_20network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['list_20checks_5',['Certification Revocation List Checks',['../index.html#crl_checks',1,'']]], + ['local_20addresses_6',['IPv6 Link Local Addresses',['../index.html#scope',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_c.js b/doc/v1.9.2/search/all_c.js new file mode 100644 index 000000000..1dbd73d0a --- /dev/null +++ b/doc/v1.9.2/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['maps_0',['Attribute Maps',['../index.html#attr_map',1,'']]], + ['message_1',['Connect and Send Message',['../index.html#nb_connect_and_send',1,'']]], + ['message_20counter_20attributes_2',['Message Counter Attributes',['../index.html#messaging_cnt_attr',1,'']]], + ['messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['messaging_20and_20byte_20streams_4',['Messaging and Byte Streams',['../index.html#service_types',1,'']]], + ['multi_20processing_20and_20fork_5',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['multiplexing_20facilities_6',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_d.js b/doc/v1.9.2/search/all_d.js new file mode 100644 index 000000000..d3ffffdb1 --- /dev/null +++ b/doc/v1.9.2/search/all_d.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['name_20verification_0',['X.509v3 Subject Name Verification',['../index.html#name_verification',1,'']]], + ['namespace_1',['UX Namespace',['../index.html#ux_naming',1,'']]], + ['namespace_20certificates_2',['namespace certificates',['../index.html#default_certs',1,'Default Namespace Certificates'],['../index.html#per_ns_certs',1,'Per-network Namespace Certificates']]], + ['namespaces_3',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20and_20ipc_20namespaces_4',['Linux Network and IPC Namespaces',['../index.html#namespaces',1,'']]], + ['network_20namespace_20certificates_5',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['non_20blocking_20connection_20establishment_6',['Non-blocking Connection Establishment',['../index.html#non_blocking_connect',1,'']]], + ['non_20blocking_20example_20sequences_7',['Non-blocking Example Sequences',['../index.html#nb_examples',1,'']]], + ['non_20blocking_20operation_8',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['non_20blocking_20send_20and_20receive_9',['Non-blocking Send and Receive',['../index.html#non_blocking_send_receive',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_e.js b/doc/v1.9.2/search/all_e.js new file mode 100644 index 000000000..e7929cfcf --- /dev/null +++ b/doc/v1.9.2/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_20multiplexing_20facilities_0',['Supported I/O Multiplexing Facilities',['../index.html#select_variants',1,'']]], + ['operation_1',['Non-blocking Operation',['../index.html#non_blocking_ops',1,'']]], + ['ordering_20guarantees_2',['Ordering Guarantees',['../index.html#ordering',1,'']]], + ['oriented_20messaging_3',['Extensible Connection-oriented Messaging',['../index.html',1,'']]], + ['outstanding_20tasks_4',['Finishing Outstanding Tasks',['../index.html#outstanding_tasks',1,'']]], + ['overall_20semantics_5',['Overall Semantics',['../index.html#semantics',1,'']]], + ['overview_6',['Overview',['../index.html#overview',1,'']]] +]; diff --git a/doc/v1.9.2/search/all_f.js b/doc/v1.9.2/search/all_f.js new file mode 100644 index 000000000..a102b8505 --- /dev/null +++ b/doc/v1.9.2/search/all_f.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['peer_20detection_0',['Dead Peer Detection',['../index.html#dpd',1,'']]], + ['per_20network_20namespace_20certificates_1',['Per-network Namespace Certificates',['../index.html#per_ns_certs',1,'']]], + ['period_20checks_2',['Certificate Validity Period Checks',['../index.html#validity_checks',1,'']]], + ['processing_20and_20fork_3',['Multi-processing and Fork',['../index.html#fork',1,'']]], + ['program_4',['Command-line Control Program',['../index.html#ctl_shell',1,'']]], + ['programming_20support_5',['Event-driven Programming Support',['../index.html#select',1,'']]], + ['protocol_20version_20and_20features_6',['TLS Protocol Version and Features',['../index.html#tls_version',1,'']]] +]; diff --git a/doc/v1.9.2/search/classes_0.js b/doc/v1.9.2/search/classes_0.js new file mode 100644 index 000000000..b428a20f2 --- /dev/null +++ b/doc/v1.9.2/search/classes_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['xcm_5faddr_5fhost_0',['xcm_addr_host',['../structxcm__addr__host.html',1,'']]], + ['xcm_5faddr_5fip_1',['xcm_addr_ip',['../structxcm__addr__ip.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/close.svg b/doc/v1.9.2/search/close.svg new file mode 100644 index 000000000..337d6cc13 --- /dev/null +++ b/doc/v1.9.2/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/doc/v1.9.2/search/defines_0.js b/doc/v1.9.2/search/defines_0.js new file mode 100644 index 000000000..1bc34c87e --- /dev/null +++ b/doc/v1.9.2/search/defines_0.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['xcm_5fbtcp_5fproto_0',['XCM_BTCP_PROTO',['../xcm__addr_8h.html#a3467f31fe6da5eeca9b879ce729888e2',1,'xcm_addr.h']]], + ['xcm_5fbtls_5fproto_1',['XCM_BTLS_PROTO',['../xcm__addr_8h.html#a8ec656233c3e8ca1807e469ba3d89546',1,'xcm_addr.h']]], + ['xcm_5ffd_5fexception_2',['XCM_FD_EXCEPTION',['../xcm__compat_8h.html#a6f7eb63ad93365ea33cda4d5bbafc8d9',1,'xcm_compat.h']]], + ['xcm_5ffd_5freadable_3',['XCM_FD_READABLE',['../xcm__compat_8h.html#a8b41267a9d7f1c267b1ef1ff446a5d06',1,'xcm_compat.h']]], + ['xcm_5ffd_5fwritable_4',['XCM_FD_WRITABLE',['../xcm__compat_8h.html#abb5f23cfc23562bae00923bdb06e7e23',1,'xcm_compat.h']]], + ['xcm_5fnonblock_5',['XCM_NONBLOCK',['../xcm_8h.html#a5741d65a6840a49421f076e1abc69a1c',1,'xcm.h']]], + ['xcm_5fsctp_5fproto_6',['XCM_SCTP_PROTO',['../xcm__addr_8h.html#a0c2db1c0954bec6eba898df48966896d',1,'xcm_addr.h']]], + ['xcm_5fso_5facceptable_7',['XCM_SO_ACCEPTABLE',['../xcm_8h.html#a6835d2d195427b0748c9c2fd782596f2',1,'xcm.h']]], + ['xcm_5fso_5freceivable_8',['XCM_SO_RECEIVABLE',['../xcm_8h.html#aa3429d5eebf90c5572549d77a3d08f2f',1,'xcm.h']]], + ['xcm_5fso_5fsendable_9',['XCM_SO_SENDABLE',['../xcm_8h.html#a864b4817dbcca717b5b9778d2c6deac3',1,'xcm.h']]], + ['xcm_5ftcp_5fproto_10',['XCM_TCP_PROTO',['../xcm__addr_8h.html#ad38b7a07ea6542f6f0dc79807dd38172',1,'xcm_addr.h']]], + ['xcm_5ftls_5fproto_11',['XCM_TLS_PROTO',['../xcm__addr_8h.html#a83f539f60c601c7f8e13f895516f61b8',1,'xcm_addr.h']]], + ['xcm_5futls_5fproto_12',['XCM_UTLS_PROTO',['../xcm__addr_8h.html#a22be66584e9c7e6cf9c94168d836ed09',1,'xcm_addr.h']]], + ['xcm_5fux_5fproto_13',['XCM_UX_PROTO',['../xcm__addr_8h.html#a9fa7914cb7c2f4e468e6da8532a2514f',1,'xcm_addr.h']]], + ['xcm_5fuxf_5fproto_14',['XCM_UXF_PROTO',['../xcm__addr_8h.html#a1f87107758918b1f65c6e46e79493257',1,'xcm_addr.h']]] +]; diff --git a/doc/v1.9.2/search/enums_0.js b/doc/v1.9.2/search/enums_0.js new file mode 100644 index 000000000..4e71eaaa8 --- /dev/null +++ b/doc/v1.9.2/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_0',['xcm_attr_type',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.2/search/enumvalues_0.js b/doc/v1.9.2/search/enumvalues_0.js new file mode 100644 index 000000000..70a037f0b --- /dev/null +++ b/doc/v1.9.2/search/enumvalues_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['xcm_5fattr_5ftype_5fbin_0',['xcm_attr_type_bin',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734aa3236b963ee7f36ecbe6983b5ac99894',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fbool_1',['xcm_attr_type_bool',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734af23ec4c97ed463979edd305fcf3ae35d',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fdouble_2',['xcm_attr_type_double',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a8f7704befc499cb1090095d216094e62',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fint64_3',['xcm_attr_type_int64',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734a38a9645de8fc284db445aeea95fe5189',1,'xcm_attr_types.h']]], + ['xcm_5fattr_5ftype_5fstr_4',['xcm_attr_type_str',['../xcm__attr__types_8h.html#abad988495911d3fa382baa0028da7734adfd53913d489b59441cc396707500f93',1,'xcm_attr_types.h']]] +]; diff --git a/doc/v1.9.2/search/files_0.js b/doc/v1.9.2/search/files_0.js new file mode 100644 index 000000000..cd36baa8d --- /dev/null +++ b/doc/v1.9.2/search/files_0.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['xcm_2eh_0',['xcm.h',['../xcm_8h.html',1,'']]], + ['xcm_5faddr_2eh_1',['xcm_addr.h',['../xcm__addr_8h.html',1,'']]], + ['xcm_5fattr_2eh_2',['xcm_attr.h',['../xcm__attr_8h.html',1,'']]], + ['xcm_5fattr_5fmap_2eh_3',['xcm_attr_map.h',['../xcm__attr__map_8h.html',1,'']]], + ['xcm_5fattr_5ftypes_2eh_4',['xcm_attr_types.h',['../xcm__attr__types_8h.html',1,'']]], + ['xcm_5fcompat_2eh_5',['xcm_compat.h',['../xcm__compat_8h.html',1,'']]], + ['xcm_5fversion_2eh_6',['xcm_version.h',['../xcm__version_8h.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/functions_0.js b/doc/v1.9.2/search/functions_0.js new file mode 100644 index 000000000..f4492c0a5 --- /dev/null +++ b/doc/v1.9.2/search/functions_0.js @@ -0,0 +1,78 @@ +var searchData= +[ + ['xcm_5faccept_0',['xcm_accept',['../xcm_8h.html#a88b0002316159f9d968c4e361c859542',1,'xcm.h']]], + ['xcm_5faccept_5fa_1',['xcm_accept_a',['../xcm_8h.html#ad4fa917f8db95f009a917dc593d21986',1,'xcm.h']]], + ['xcm_5faddr_5fmake_5fbtcp_2',['xcm_addr_make_btcp',['../xcm__addr_8h.html#adfdd9cae5f041912ca3016a20d8dad25',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fbtls_3',['xcm_addr_make_btls',['../xcm__addr_8h.html#a15803c612536061a22254f8d379382d4',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fsctp_4',['xcm_addr_make_sctp',['../xcm__addr_8h.html#af2528e74000e6dec0e7300073fa9823f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftcp_5',['xcm_addr_make_tcp',['../xcm__addr_8h.html#a773fc0b5e57d784c6fa7dfdca7bb70a2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5ftls_6',['xcm_addr_make_tls',['../xcm__addr_8h.html#a8cc13cbdcac80fd8eb06e1c9e010bca2',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5futls_7',['xcm_addr_make_utls',['../xcm__addr_8h.html#a3d8b23fc4a436409a4ac2d883ecd679f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fux_8',['xcm_addr_make_ux',['../xcm__addr_8h.html#a415d95a77607211e1d47c75a662a43bf',1,'xcm_addr.h']]], + ['xcm_5faddr_5fmake_5fuxf_9',['xcm_addr_make_uxf',['../xcm__addr_8h.html#a96b63426595f1440edb1c44d96328c18',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtcp_10',['xcm_addr_parse_btcp',['../xcm__addr_8h.html#a95df7e253a4585911554fa6d054161b9',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fbtls_11',['xcm_addr_parse_btls',['../xcm__addr_8h.html#a67dbf6881b2e06b783b4039643f3c252',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fproto_12',['xcm_addr_parse_proto',['../xcm__addr_8h.html#ab4e11f9930c6565d8dd93585893b0c3e',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fsctp_13',['xcm_addr_parse_sctp',['../xcm__addr_8h.html#a40a8abc3275f4d9f566b8b880e6fd555',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftcp_14',['xcm_addr_parse_tcp',['../xcm__addr_8h.html#ac7ecc5b12306623a8c920c6948ff06a0',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5ftls_15',['xcm_addr_parse_tls',['../xcm__addr_8h.html#ac467dfd40d55905cdcfed65edaeb13ff',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5futls_16',['xcm_addr_parse_utls',['../xcm__addr_8h.html#a55d25b40a2e46c70217e9b3c8b830bd6',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fux_17',['xcm_addr_parse_ux',['../xcm__addr_8h.html#a932665c9816460c54858323ce27cc52f',1,'xcm_addr.h']]], + ['xcm_5faddr_5fparse_5fuxf_18',['xcm_addr_parse_uxf',['../xcm__addr_8h.html#a02ce4dfe1ea12a0eb00d9132aa49f7f1',1,'xcm_addr.h']]], + ['xcm_5fattr_5fget_19',['xcm_attr_get',['../xcm__attr_8h.html#accaa82dfb750ba09b9d999a8ce59d95f',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fall_20',['xcm_attr_get_all',['../xcm__attr_8h.html#a70e3d50e47019f12d67378bf964cfa5e',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbin_21',['xcm_attr_get_bin',['../xcm__attr_8h.html#a36f2e5fc4d5d1db65741cb451cd13948',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fbool_22',['xcm_attr_get_bool',['../xcm__attr_8h.html#ad63d5e1923fb4c47972084ac6e100f77',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fdouble_23',['xcm_attr_get_double',['../xcm__attr_8h.html#ad68393beec206df7f5464ff7e304f322',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fint64_24',['xcm_attr_get_int64',['../xcm__attr_8h.html#a1979f266713492a2963f5f898892f2ec',1,'xcm_attr.h']]], + ['xcm_5fattr_5fget_5fstr_25',['xcm_attr_get_str',['../xcm__attr_8h.html#a457e75525cb8c3b0d3222617b3390830',1,'xcm_attr.h']]], + ['xcm_5fattr_5fmap_5fadd_26',['xcm_attr_map_add',['../xcm__attr__map_8h.html#a1f2eb6f1a4920ad777fdda287c25eefa',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fall_27',['xcm_attr_map_add_all',['../xcm__attr__map_8h.html#a232a7b4c8ce1cb31dabfef08c00f8c70',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbin_28',['xcm_attr_map_add_bin',['../xcm__attr__map_8h.html#ad94a947d7bc9919ab0147e96b7c1dd71',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fbool_29',['xcm_attr_map_add_bool',['../xcm__attr__map_8h.html#ad618223af0a37c2c55814f84e8d27637',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fdouble_30',['xcm_attr_map_add_double',['../xcm__attr__map_8h.html#ab0527cbe734df9538ffa160b3bf71367',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fint64_31',['xcm_attr_map_add_int64',['../xcm__attr__map_8h.html#a621c6f6e5d062f1d28ebbc9cc79be730',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fadd_5fstr_32',['xcm_attr_map_add_str',['../xcm__attr__map_8h.html#a3f1421bc7c615faa5370158f08b77644',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fclone_33',['xcm_attr_map_clone',['../xcm__attr__map_8h.html#a365c5be949be0a8e1469f9667ba013a2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fcreate_34',['xcm_attr_map_create',['../xcm__attr__map_8h.html#a128624b0a4d5ffe8defb482c63f6396e',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdel_35',['xcm_attr_map_del',['../xcm__attr__map_8h.html#a6f6cb2c1db3644de06508c3ccc7b5e82',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fdestroy_36',['xcm_attr_map_destroy',['../xcm__attr__map_8h.html#aeafbfc82e1229a77233dd7811e175fb5',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fequal_37',['xcm_attr_map_equal',['../xcm__attr__map_8h.html#a6c0881a7f3fc5e44bed084fc1e3301c9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fexists_38',['xcm_attr_map_exists',['../xcm__attr__map_8h.html#afc2f7f4a4f44905e5dba9c0712c8cf5b',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fforeach_39',['xcm_attr_map_foreach',['../xcm__attr__map_8h.html#a1dbca639449550ea0d4947edeb95b518',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_40',['xcm_attr_map_get',['../xcm__attr__map_8h.html#afcd7fa8842c7c5d21555c4b977d18ac2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbin_41',['xcm_attr_map_get_bin',['../xcm__attr__map_8h.html#a47c97e944ee792af043738ff8ea97ffb',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fbool_42',['xcm_attr_map_get_bool',['../xcm__attr__map_8h.html#a0b807acbe2966790514041546c998125',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fdouble_43',['xcm_attr_map_get_double',['../xcm__attr__map_8h.html#a0e631906cee3c686c9b3807c706e572c',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fint64_44',['xcm_attr_map_get_int64',['../xcm__attr__map_8h.html#a1028339c2c27de1305006950730745a9',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fget_5fstr_45',['xcm_attr_map_get_str',['../xcm__attr__map_8h.html#ab0a93ca0131e5259188faaf869891db2',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fmap_5fsize_46',['xcm_attr_map_size',['../xcm__attr__map_8h.html#ad17af4c95518a57d3525d238a57cf004',1,'xcm_attr_map.h']]], + ['xcm_5fattr_5fset_47',['xcm_attr_set',['../xcm__attr_8h.html#a182c1e6606a5481e6d10693a7b2db839',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fbool_48',['xcm_attr_set_bool',['../xcm__attr_8h.html#abac895b2add081512bbc59eca02b9c55',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fdouble_49',['xcm_attr_set_double',['../xcm__attr_8h.html#a060693dc9d398adf1c080b39495b25d2',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fint64_50',['xcm_attr_set_int64',['../xcm__attr_8h.html#a62b26243953e9466d30c6f28ec3fef45',1,'xcm_attr.h']]], + ['xcm_5fattr_5fset_5fstr_51',['xcm_attr_set_str',['../xcm__attr_8h.html#aae5aef3cf81d76fd61066d03db0fb1d4',1,'xcm_attr.h']]], + ['xcm_5fawait_52',['xcm_await',['../xcm_8h.html#a0ad43ceebe461d6f361bc8f11d5dd463',1,'xcm.h']]], + ['xcm_5fcleanup_53',['xcm_cleanup',['../xcm_8h.html#ab74466386ee40c9e5992940822b4ec02',1,'xcm.h']]], + ['xcm_5fclose_54',['xcm_close',['../xcm_8h.html#abb5449c1b0818cf422cffe799872a570',1,'xcm.h']]], + ['xcm_5fconnect_55',['xcm_connect',['../xcm_8h.html#ae20ec97fe774a1d92e3fde4ec1d4aa91',1,'xcm.h']]], + ['xcm_5fconnect_5fa_56',['xcm_connect_a',['../xcm_8h.html#ae8e67bc6e21a33371bd273e089d6d741',1,'xcm.h']]], + ['xcm_5ffd_57',['xcm_fd',['../xcm_8h.html#a11d9fe2b8cf695cd7b9cf30d01d12d4c',1,'xcm.h']]], + ['xcm_5ffinish_58',['xcm_finish',['../xcm_8h.html#a93e6a75d0f3a97207beb406cd6787df4',1,'xcm.h']]], + ['xcm_5fis_5fblocking_59',['xcm_is_blocking',['../xcm_8h.html#a6cfdb3e1a859549d686c93b32c6a6818',1,'xcm.h']]], + ['xcm_5flocal_5faddr_60',['xcm_local_addr',['../xcm_8h.html#a7fefa1353b41c2445e13603e80f56336',1,'xcm.h']]], + ['xcm_5freceive_61',['xcm_receive',['../xcm_8h.html#a58463793b550c16e021efe04b0d743ae',1,'xcm.h']]], + ['xcm_5fremote_5faddr_62',['xcm_remote_addr',['../xcm_8h.html#a6150197cffea9d5ff610bb856b5fd2de',1,'xcm.h']]], + ['xcm_5fsend_63',['xcm_send',['../xcm_8h.html#af3fa59a1297e444a001b6392d073718d',1,'xcm.h']]], + ['xcm_5fserver_64',['xcm_server',['../xcm_8h.html#ab6dd2ff0e70e5658200fe574ee44eba2',1,'xcm.h']]], + ['xcm_5fserver_5fa_65',['xcm_server_a',['../xcm_8h.html#a6b334574c9e1b15af4c0350d8b7cf9ad',1,'xcm.h']]], + ['xcm_5fset_5fblocking_66',['xcm_set_blocking',['../xcm_8h.html#ae833dd506b15de04445e3a8331ad36bf',1,'xcm.h']]], + ['xcm_5fversion_67',['xcm_version',['../xcm__version_8h.html#ab797c74b3da43962e05bffdd7ccda410',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_68',['xcm_version_api',['../xcm__version_8h.html#a156774c1ccc79ecc7fb94cb00b9f04a7',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fmajor_69',['xcm_version_api_major',['../xcm__version_8h.html#aa8ae4ef1b98520bb535432fdf437c920',1,'xcm_version.h']]], + ['xcm_5fversion_5fapi_5fminor_70',['xcm_version_api_minor',['../xcm__version_8h.html#ad91dc0f7e2682a124404b54fc36e5f77',1,'xcm_version.h']]], + ['xcm_5fversion_5fmajor_71',['xcm_version_major',['../xcm__version_8h.html#a37c2301543018f3b6a3a141d4f26c333',1,'xcm_version.h']]], + ['xcm_5fversion_5fminor_72',['xcm_version_minor',['../xcm__version_8h.html#abffc4bc468b1aed6c6944a10e4fea5cc',1,'xcm_version.h']]], + ['xcm_5fversion_5fpatch_73',['xcm_version_patch',['../xcm__version_8h.html#aceea7515ad5ed627a4f8d00840867df6',1,'xcm_version.h']]], + ['xcm_5fwant_74',['xcm_want',['../xcm__compat_8h.html#a2e09a4b8705bb688ffe57f184308186e',1,'xcm_compat.h']]] +]; diff --git a/doc/v1.9.2/search/groups_0.js b/doc/v1.9.2/search/groups_0.js new file mode 100644 index 000000000..4bbe9a06f --- /dev/null +++ b/doc/v1.9.2/search/groups_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['api_20version_0',['API Version',['../group__api__version.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/groups_1.js b/doc/v1.9.2/search/groups_1.js new file mode 100644 index 000000000..c04facc18 --- /dev/null +++ b/doc/v1.9.2/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['library_20version_0',['Library Version',['../group__lib__version.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/groups_2.js b/doc/v1.9.2/search/groups_2.js new file mode 100644 index 000000000..93c3dc92f --- /dev/null +++ b/doc/v1.9.2/search/groups_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['version_0',['version',['../group__api__version.html',1,'API Version'],['../group__lib__version.html',1,'Library Version']]] +]; diff --git a/doc/v1.9.2/search/mag.svg b/doc/v1.9.2/search/mag.svg new file mode 100644 index 000000000..ffb6cf0d0 --- /dev/null +++ b/doc/v1.9.2/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.9.2/search/mag_d.svg b/doc/v1.9.2/search/mag_d.svg new file mode 100644 index 000000000..4122773f9 --- /dev/null +++ b/doc/v1.9.2/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/doc/v1.9.2/search/mag_sel.svg b/doc/v1.9.2/search/mag_sel.svg new file mode 100644 index 000000000..553dba877 --- /dev/null +++ b/doc/v1.9.2/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.9.2/search/mag_seld.svg b/doc/v1.9.2/search/mag_seld.svg new file mode 100644 index 000000000..c906f84c8 --- /dev/null +++ b/doc/v1.9.2/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/doc/v1.9.2/search/pages_0.js b/doc/v1.9.2/search/pages_0.js new file mode 100644 index 000000000..915514a0d --- /dev/null +++ b/doc/v1.9.2/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/pages_1.js b/doc/v1.9.2/search/pages_1.js new file mode 100644 index 000000000..2d049f4ab --- /dev/null +++ b/doc/v1.9.2/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['extensible_20connection_20oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/pages_2.js b/doc/v1.9.2/search/pages_2.js new file mode 100644 index 000000000..9b94859cb --- /dev/null +++ b/doc/v1.9.2/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/pages_3.js b/doc/v1.9.2/search/pages_3.js new file mode 100644 index 000000000..78d84e0d7 --- /dev/null +++ b/doc/v1.9.2/search/pages_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['oriented_20messaging_0',['Extensible Connection-oriented Messaging',['../index.html',1,'']]] +]; diff --git a/doc/v1.9.2/search/search.css b/doc/v1.9.2/search/search.css new file mode 100644 index 000000000..19f76f9d5 --- /dev/null +++ b/doc/v1.9.2/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/doc/v1.9.2/search/search.js b/doc/v1.9.2/search/search.js new file mode 100644 index 000000000..6fd40c677 --- /dev/null +++ b/doc/v1.9.2/search/search.js @@ -0,0 +1,840 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var jsFile; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + var loadJS = function(url, impl, loc){ + var scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + var domSearchBox = this.DOMSearchBox(); + var domPopupSearchResults = this.DOMPopupSearchResults(); + var domSearchClose = this.DOMSearchClose(); + var resultsPath = this.resultsPath; + + var handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') + { + domSearchClose.style.display = 'inline-block'; + var left = getXPos(domSearchBox) + 150; + var top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + var maxWidth = document.body.clientWidth; + var maxHeight = document.body.clientHeight; + var width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + var height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults(resultsPath) +{ + var results = document.getElementById("SRResults"); + results.innerHTML = ''; + for (var e=0; e + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_host Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_host Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    enum xcm_addr_type type
     
    union { 
     
    +   struct xcm_addr_ip   ip 
     
    +   char   name [254] 
     
    };  
     
    +

    Detailed Description

    +

    Hostname or IPv4/IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ type

    + +
    +
    + + + + +
    enum xcm_addr_type xcm_addr_host::type
    +
    +

    Type tag

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_host
    +
    +

    Union containing the actual hostname, IPv4 or IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.9.2/structxcm__addr__ip.html b/doc/v1.9.2/structxcm__addr__ip.html new file mode 100644 index 000000000..5b795f6bd --- /dev/null +++ b/doc/v1.9.2/structxcm__addr__ip.html @@ -0,0 +1,165 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): xcm_addr_ip Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    xcm_addr_ip Struct Reference
    +
    +
    + +

    #include <xcm_addr.h>

    + + + + + + + + + + + + +

    +Data Fields

    sa_family_t family
     
    union { 
     
       in_addr_t   ip4 
     
       uint8_t   ip6 [16] 
     
    addr 
     
    +

    Detailed Description

    +

    IPv4 or IPv6 address data type.

    +

    Field Documentation

    + +

    ◆ family

    + +
    +
    + + + + +
    sa_family_t xcm_addr_ip::family
    +
    +

    Type tag; AF_INET or AF_INET6

    + +
    +
    + +

    ◆ ip4

    + +
    +
    + + + + +
    in_addr_t xcm_addr_ip::ip4
    +
    +

    Contains the IPv4 address in network byte order (in case family is set to AF_INET).

    + +
    +
    + +

    ◆ ip6

    + +
    +
    + + + + +
    uint8_t xcm_addr_ip::ip6[16]
    +
    +

    Contains the IPv6 address (in case family is set to AF_INET6).

    + +
    +
    + +

    ◆ [union]

    + +
    +
    + + + + +
    union { ... } xcm_addr_ip::addr
    +
    +

    Union containing the actual IPv4 or a IPv6 address bytes

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/doc/v1.9.2/sync_off.png b/doc/v1.9.2/sync_off.png new file mode 100644 index 000000000..3b443fc62 Binary files /dev/null and b/doc/v1.9.2/sync_off.png differ diff --git a/doc/v1.9.2/sync_on.png b/doc/v1.9.2/sync_on.png new file mode 100644 index 000000000..e08320fb6 Binary files /dev/null and b/doc/v1.9.2/sync_on.png differ diff --git a/doc/v1.9.2/tab_a.png b/doc/v1.9.2/tab_a.png new file mode 100644 index 000000000..3b725c41c Binary files /dev/null and b/doc/v1.9.2/tab_a.png differ diff --git a/doc/v1.9.2/tab_ad.png b/doc/v1.9.2/tab_ad.png new file mode 100644 index 000000000..e34850acf Binary files /dev/null and b/doc/v1.9.2/tab_ad.png differ diff --git a/doc/v1.9.2/tab_b.png b/doc/v1.9.2/tab_b.png new file mode 100644 index 000000000..e2b4a8638 Binary files /dev/null and b/doc/v1.9.2/tab_b.png differ diff --git a/doc/v1.9.2/tab_bd.png b/doc/v1.9.2/tab_bd.png new file mode 100644 index 000000000..91c252498 Binary files /dev/null and b/doc/v1.9.2/tab_bd.png differ diff --git a/doc/v1.9.2/tab_h.png b/doc/v1.9.2/tab_h.png new file mode 100644 index 000000000..fd5cb7054 Binary files /dev/null and b/doc/v1.9.2/tab_h.png differ diff --git a/doc/v1.9.2/tab_hd.png b/doc/v1.9.2/tab_hd.png new file mode 100644 index 000000000..2489273d4 Binary files /dev/null and b/doc/v1.9.2/tab_hd.png differ diff --git a/doc/v1.9.2/tab_s.png b/doc/v1.9.2/tab_s.png new file mode 100644 index 000000000..ab478c95b Binary files /dev/null and b/doc/v1.9.2/tab_s.png differ diff --git a/doc/v1.9.2/tab_sd.png b/doc/v1.9.2/tab_sd.png new file mode 100644 index 000000000..757a565ce Binary files /dev/null and b/doc/v1.9.2/tab_sd.png differ diff --git a/doc/v1.9.2/tabs.css b/doc/v1.9.2/tabs.css new file mode 100644 index 000000000..df7944b79 --- /dev/null +++ b/doc/v1.9.2/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0px/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all 0.25s;transition:all 0.25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked~.main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}#main-menu-state:not(:checked)~#main-menu{display:none}#main-menu-state:checked~#main-menu{display:block}@media (min-width: 768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked)~#main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0px 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:none}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#D23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0px 1px 1px #000}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media (min-width: 768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0px 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);border-radius:5px !important;box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #D23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#D23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} diff --git a/doc/v1.9.2/topics.html b/doc/v1.9.2/topics.html new file mode 100644 index 000000000..5a48d83ce --- /dev/null +++ b/doc/v1.9.2/topics.html @@ -0,0 +1,87 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): Topics + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    + + + + diff --git a/doc/v1.9.2/xcm_8h.html b/doc/v1.9.2/xcm_8h.html new file mode 100644 index 000000000..3cca9f335 --- /dev/null +++ b/doc/v1.9.2/xcm_8h.html @@ -0,0 +1,917 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm.h File Reference
    +
    +
    + +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API. +More...

    +
    #include <errno.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <sys/types.h>
    +#include <xcm_attr_map.h>
    +#include <xcm_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Macros

    #define XCM_NONBLOCK   (1<<0)
     
    #define XCM_SO_RECEIVABLE   (1<<0)
     
    #define XCM_SO_SENDABLE   (1<<1)
     
    #define XCM_SO_ACCEPTABLE   (1<<2)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_socket * xcm_connect (const char *remote_addr, int flags)
     
    struct xcm_socket * xcm_connect_a (const char *remote_addr, const struct xcm_attr_map *attrs)
     
    struct xcm_socket * xcm_server (const char *local_addr)
     
    struct xcm_socket * xcm_server_a (const char *local_addr, const struct xcm_attr_map *attrs)
     
    int xcm_close (struct xcm_socket *socket)
     
    void xcm_cleanup (struct xcm_socket *socket)
     
    struct xcm_socket * xcm_accept (struct xcm_socket *server_socket)
     
    struct xcm_socket * xcm_accept_a (struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
     
    int xcm_send (struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
     
    int xcm_receive (struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
     
    int xcm_await (struct xcm_socket *socket, int condition)
     
    int xcm_fd (struct xcm_socket *socket)
     
    int xcm_finish (struct xcm_socket *socket)
     
    int xcm_set_blocking (struct xcm_socket *socket, bool should_block)
     
    bool xcm_is_blocking (struct xcm_socket *socket)
     
    const char * xcm_remote_addr (struct xcm_socket *conn_socket)
     
    const char * xcm_local_addr (struct xcm_socket *socket)
     
    +

    Detailed Description

    +

    This file contains the core Extensible Connection-oriented Messaging (XCM) API.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_NONBLOCK

    + +
    +
    + + + + +
    #define XCM_NONBLOCK   (1<<0)
    +
    +

    Flag used in xcm_connect()

    + +
    +
    + +

    ◆ XCM_SO_RECEIVABLE

    + +
    +
    + + + + +
    #define XCM_SO_RECEIVABLE   (1<<0)
    +
    +

    Flag bit denoting a socket where the application likely can receive data.

    + +
    +
    + +

    ◆ XCM_SO_SENDABLE

    + +
    +
    + + + + +
    #define XCM_SO_SENDABLE   (1<<1)
    +
    +

    Flag bit denoting a socket where the application likely can send data.

    + +
    +
    + +

    ◆ XCM_SO_ACCEPTABLE

    + +
    +
    + + + + +
    #define XCM_SO_ACCEPTABLE   (1<<2)
    +
    +

    Flag bit denoting a socket with a pending incoming connection.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_connect()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect (const char * remote_addr,
    int flags 
    )
    +
    +

    Connects to a remote server socket.

    +

    This function returns a connection socket, which is used to send messages to, and receive messages from the server.

    +

    In BSD Sockets terms, this call does both socket() and connect().

    +

    By default, xcm_connect() blocks for the time it takes for the transport to determine if the named remote endpoint exists, and is responding (including any initial handshaking, key exchange etc). If the remote server socket is not yet bound, it's up to the application to retry.

    +

    If the XCM_NONBLOCK flag is set, xcm_connect() will work in a non-blocking fashion and will always return immediately, either leaving the connection socket in a connected state, a partly connected state, or signaling an error.

    +

    Setting XCM_NONBLOCK will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    See Event-driven Programming Support for an overview how non-blocking mode is used.

    +

    For non-blocking connection establishment attempts, the application may use xcm_finish() the query the result. It should use xcm_fd() and select() to wait for the appropriate time to make the xcm_finish() call (although it may be called at any point).

    +

    xcm_connect() with the XCM_NONBLOCK flag set will leave the connection in non-blocking mode (see xcm_set_blocking() for details).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create connectionx sockets with the byte stream service type.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]flagsEither 0, or XCM_NONBLOCK for a non-blocking connect.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    +

    See xcm_finish() for other possible errno values.

    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_connect_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_connect_a (const char * remote_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Connects to a remote server socket, with attributes.

    +

    This function is equivalent to xcm_connect(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of the connection establishment.

    +

    The primary reasons for this function is to allow setting attributes that needs to be set prior to, or during, actual connection establishment. In addition, xcm_connect_a() serves as a convenience function, letting applications avoid repeated xcm_attr_set() calls.

    +
    Parameters
    + + + +
    [in]remote_addrThe remote address which to connect.
    [in]attrsA set of attributes to be applied to the connection socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_connect() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_server()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_server (const char * local_addr)
    +
    +

    Creates a server socket and binds it to a specific address.

    +

    This function creates a server socket and binds it to a specific address. After this call has completed, clients may connect to the address specified.

    +

    This call is the equivalent of socket()+bind()+listen() in BSD Sockets. In case remote_addr has a DNS domain name (as opposed to an IP address), an xcm_server() call also includes a blocking name resolution (e.g. gethostbyname()).

    +

    Since the "xcm.service" attribute defaults to "messaging", this function cannot be used to create server sockets with the byte stream service type.

    +
    Parameters
    + + +
    [in]local_addrThe local address to which this socket should be bound.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EACCESS Permission to create the socket was denied.
    EADDRINUSE Local socket address is already in use.
    ENOMEM Insufficient memory.
    EINVAL Invalid address format.
    ENOPROTOOPT Transport protocol not available.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EPROTO A protocol error occured.
    ENOENT DNS domain name resolution failed.
    +
    See also
    xcm_close
    + +
    +
    + +

    ◆ xcm_server_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_server_a (const char * local_addr,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Creates and binds to a server socket, with attributes.

    +

    This function is equivalent to xcm_server(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of server socket creation.

    +
    Parameters
    + + + +
    [in]local_addrThe local address to which this socket should be bound.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a server socket reference on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_server() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_close()

    + +
    +
    + + + + + + + + +
    int xcm_close (struct xcm_socket * socket)
    +
    +

    Close an endpoint.

    +

    This function close an XCM socket, including both signaling to the far and freeing of any local resources associated with this socket.

    +

    xcm_close() will not block, and applications wanting to finish any outstanding tasks on a socket in non-blocking mode should use xcm_finish() to do so.

    +
    Parameters
    + + +
    [in]socketThe socket to be closed, or NULL (in case xcm_close() is a no-operation).
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    +
    See also
    xcm_cleanup
    + +
    +
    + +

    ◆ xcm_cleanup()

    + +
    +
    + + + + + + + + +
    void xcm_cleanup (struct xcm_socket * socket)
    +
    +

    Cleans up any local resources tied to an XCM socket not owned by the caller process.

    +

    After a fork() call, either of the two processes (the parent, or the child) must be designated the owner of every XCM socket the parent owned.

    +

    The owner may continue to use the XCM socket normally.

    +

    The non-owner may use xcm_cleanup() to free any local memory tied to this socket, without impacting the connection state in the owner process.

    +

    The non-owner may not call xcm_close() or any other XCM API call.

    +

    The owner may not call xcm_cleanup().

    +
    Parameters
    + + +
    [in]socketThe socket which local resources are to be freed, or NULL (in case xcm_cleanup() is a no-operation).
    +
    +
    + +
    +
    + +

    ◆ xcm_accept()

    + +
    +
    + + + + + + + + +
    struct xcm_socket * xcm_accept (struct xcm_socket * server_socket)
    +
    +

    Retrieve a pending incoming connection from the server socket's queue.

    +

    xcm_accept() retrieves the first connection request from the server socket's queue of pending connections.

    +

    In case the server socket is in non-blocking mode, the XCM connection socket returned from xcm_accept() will also be in non-blocking mode.

    +
    Parameters
    + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_accept_a()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    struct xcm_socket * xcm_accept_a (struct xcm_socket * server_socket,
    const struct xcm_attr_map * attrs 
    )
    +
    +

    Retrieve a pending incoming connection, with attributes.

    +

    This function is equivalent to xcm_accept(), only it also allows the caller to specify a set of Socket Attributes to be applied as a part of accepting the new connection socket.

    +

    Such attributes will override any value inherited from the server socket.

    +
    Parameters
    + + + +
    [in]server_socketThe server socket on which to attempt to accept one pending connection.
    [in]attrsA set of attributes to be applied to the socket, or NULL. Only accessed during the call.
    +
    +
    +
    Returns
    Returns a newly created XCM connection socket on success, or NULL if an error occured (in which case errno is set).
    +

    See xcm_accept() and xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_send()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_send (struct xcm_socket *__restrict conn_socket,
    const void *__restrict buf,
    size_t len 
    )
    +
    +

    Send message on a particular connection.

    +

    The xcm_send() function is used to send a message (or a sequence of bytes, for byte stream transports) out on a connection socket.

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will be sent on.
    [in]bufA pointer to the data buffer.
    [in]lenThe length of the buffer in bytes. Zero-length buffers are not allowed for messaging type transports.
    +
    +
    +
    Returns
    For messaging transports, 0 is returned on success. For byte stream transports, the number of bytes accepted into the XCM layer is returned (which may be shorter than len, but which is always greater than zero). In case of an error, -1 is returned (and errno is set).
    + + + + + +
    errno Description
    EMSGSIZE Message is too large. See also the maximum size attribute in Generic Attributes. Only applicable to messaging transports.
    +

    See xcm_finish() for more errno values.

    + +
    +
    + +

    ◆ xcm_receive()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_receive (struct xcm_socket *__restrict conn_socket,
    void *__restrict buf,
    size_t capacity 
    )
    +
    +

    Receive message on a particular connection.

    +

    The xcm_receive() function is used to receive data on a connection socket. For messaging type transport connections, xcm_receive() produces at most one message, in its entirety. For byte stream transports, xcm_receive() returns a sequence of bytes.

    +

    If the connection is of the messaging service type and the capacity of the user-supplied buffer is smaller than the actual message length, the message will be truncated and the part that fits will be stored in the buffer. The return value will be the length of the truncated message (i.e. the capacity).

    +
    Parameters
    + + + + +
    [in]conn_socketThe connection socket the data will receive be on.
    [out]bufThe user-supplied buffer where the incoming data will be stored.
    [in]capacityThe capacity in bytes of the buffer.
    +
    +
    +
    Returns
    Returns the amount (> 0 bytes) of data stored in the buffer, 0 if the remote end has closed the connection, or -1 if an error occured (in which case errno is set).
    +

    See xcm_finish() for possible errno values.

    + +
    +
    + +

    ◆ xcm_await()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_await (struct xcm_socket * socket,
    int condition 
    )
    +
    +

    Inform socket of which operations the application is waiting to perform.

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    Using xcm_await(), the application informs the XCM socket what conditions it's waiting for (i.e. what XCM operations it wants to perform). These conditions are stored in the socket, and won't change until the application calls xcm_await() again.

    +

    The condition parameter is a bitmask, with the valid bits being XCM_SO_RECEIVABLE or XCM_SO_SENDABLE (for connection socket) or XCM_SO_ACCEPTABLE (for server sockets). If no bits are set, the application is not interested in anything beyond the XCM socket to finish any outstanding tasks.

    +

    Typically, the application would call xcm_await() when an XCM operation (such as xcm_receive()) has failed with errno set to EAGAIN. However, the application may also call xcm_await() even though neither xcm_send(), xcm_receive(), nor xcm_finish() has failed in such a manner.

    +

    In case any of the conditions the application is asking for are believed to be met already at the time of the xcm_await() call, the XCM socket fd (see xcm_fd() for details) will be marked as ready to be read.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Even though XCM socket fd is marked readable (by select()), and thus the application-specified conditions for a particular connection socket are likely met, there's no guarantee that the API operation (i.e. xcm_send(), xcm_receive() or xcm_accept()) will succeed.

    +

    If an application is waiting for both XCM_SO_SENDABLE and XCM_SO_RECEIVABLE, is should try both to send and receive when the socket fd is marked readable.

    +
    Parameters
    + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode, or the condition bits are invalid.
    + +
    +
    + +

    ◆ xcm_fd()

    + +
    +
    + + + + + + + + +
    int xcm_fd (struct xcm_socket * socket)
    +
    +

    Returns XCM socket fd.

    +

    This call retrieves an XCM socket's file descriptor, for an XCM socket in non-blocking mode.

    +

    When this fd becomes readable, the XCM socket is ready to make progress.

    +

    Progress can mean both progress toward the goal of reaching the application's desired socket condition (see xcm_await() for details), or finishing any outstanding task the XCM socket has.

    +

    Note that the XCM socket fd is only ever marked readable (as opposed to writable). This is true even if the application is waiting to send a message on the socket. Marked readable means that the fd is, for example, marked with EPOLLIN, in case epoll_wait() is used, or has its bit set in the readfs fd_set, in case select() is used.

    +

    When the XCM socket fd becomes readable, an application would typically perform the actions it specified in xcm_await()'s condition parameter. It is not forced to do so, but may choose to perform other API operations instead. However, if neither xcm_send() nor xcm_receive() is called, the application must call xcm_finish(). The xcm_finish() call must be made, even though the condition parameter was set to zero. This is to allow the socket make progress on its background tasks. See Finishing Outstanding Tasks for details.

    +

    The fd is owned by the XCM socket, and must not be closed or otherwise manipulated by the application, other than used in select() (or the equivalent). It is no longer valid, when the corresponding XCM socket is closed.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns a fd in the form of a non-negative integer on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL The socket is not in non-blocking mode.
    +
    See also
    xcm_await
    + +
    +
    + +

    ◆ xcm_finish()

    + +
    +
    + + + + + + + + +
    int xcm_finish (struct xcm_socket * socket)
    +
    +

    Attempts to finish an ongoing non-blocking background operation.

    +

    This call is used by an application having issued xcm_connect() with the XCM_NONBLOCK flag set (or xcm_connect_a() with the "xcm.blocking" attribute set to false), xcm_accept() or xcm_send() call on a connection socket in non-blocking mode, wishing to finish outstanding processing related to that operation, and to know if it succeeded or not.

    +

    In addition, xcm_finish() must be called if the conditions on a non-blocking socket are met (as signaled by select() marking the socket fd returned by xcm_fd() as readable), unless the application calls xcm_send(), xcm_receive() or xcm_accept() on that socket. See Finishing Outstanding Tasks for details.

    +

    xcm_finish() may be called at any time.

    +
    Parameters
    + + +
    [in]socketThe connection or server socket.
    +
    +
    +
    Returns
    Returns 0 if the connection has been successfully been established, or -1 if it has not (in which case errno is set).
    +

    These errno values are possible not only for xcm_finish(), but also for xcm_connect(), xcm_accept(), xcm_send(), and xcm_receive().

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    errno Description
    EPIPE The connection is closed.
    EAGAIN The socket is marked non-blocking (with xcm_set_blocking()) and the requested operation would block.
    ECONNRESET Connection reset by peer.
    ECONNREFUSED No-one is listening on the remote address.
    ECONNABORTED A connection has been aborted due to host-internal reasons.
    EHOSTUNREACH Remote host is unreachable.
    ENETUNREACH Network is unreachable.
    ETIMEDOUT No or lost network connectivity.
    ENOMEM Insufficient memory (or other resources) to perform operation.
    EINTR The operation was interrupted by a UNIX signal.
    EPROTO A non-recoverable protocol error occurred.
    EMFILE The per-process limit on the number of open file descriptors has been reached.
    ENFILE The limit on the total number of open file descriptors has been reached.
    EACCES Permission to create the socket was denied.
    ENOENT DNS domain name resolution failed.
    + +
    +
    + +

    ◆ xcm_set_blocking()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    int xcm_set_blocking (struct xcm_socket * socket,
    bool should_block 
    )
    +
    +

    Enabled or disabled non-blocking operation on this socket.

    +

    In blocking mode (which is the default), xcm_send() and xcm_receive() calls does not return until a message has been handed over to the system (in case of send), or received from the system (in case of receive), or an error has occured (whichever happens first).

    +

    In non-blocking mode, xcm_send() and xcm_receive() will return immediately, regardless if XCM has been enable to fulfill the application's request or not.

    +

    Server sockets may also be set into non-blocking mode, in which case xcm_accept() won't block.

    +

    Connection sockets created as a result of xcm_connect() may be set into non-blocking mode already from the start, by means of the XCM_NONBLOCK flag to xcm_connect(), in which case also the connection establishment process is non-blocking.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    To set a non-blocking connection socket into blocking mode, it needs to have finished all outstanding tasks. See Finishing Outstanding Tasks for details.

    +

    Setting the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + + +
    [in]socketThe socket.
    [in]should_blockSet to true for blocking operation, false for non-blocking mode.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EAGAIN The connection socket has unfinished work that needs to completed before mode can be switched.
    + +
    +
    + +

    ◆ xcm_is_blocking()

    + +
    +
    + + + + + + + + +
    bool xcm_is_blocking (struct xcm_socket * socket)
    +
    +

    Query whether or not a socket is in non-blocking mode.

    +

    For an overview of the use of non-blocking mode, see Event-driven Programming Support.

    +

    Reading the "xcm.blocking" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketThe socket.
    +
    +
    +
    Returns
    Returns true if the socket is in blocking mode, or false if it is in non-blocking mode.
    +
    See also
    xcm_set_blocking
    + +
    +
    + +

    ◆ xcm_remote_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_remote_addr (struct xcm_socket * conn_socket)
    +
    +

    Returns the address of the remote endpoint for this connection.

    +

    This operation only works for sockets representing connections.

    +

    The address returned is in string format, and the pointer returned is to an buffer allocated as a part of the socket state, and need not and should not be free'd by the user.

    +

    Reading the "xcm.remote_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]conn_socketThe connection socket.
    +
    +
    +
    Returns
    Returns the remote endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    + +

    ◆ xcm_local_addr()

    + +
    +
    + + + + + + + + +
    const char * xcm_local_addr (struct xcm_socket * socket)
    +
    +

    Returns the address of the local endpoint for this socket.

    +

    Just like xcm_remote_addr(), but returns the local endpoint address.

    +

    This function applies to both server and connection sockets.

    +

    Reading the "xcm.local_addr" attribute is an alternative to using this function. See Generic Attributes.

    +
    Parameters
    + + +
    [in]socketA server or connection socket.
    +
    +
    +
    Returns
    Returns the local endpoint address, or NULL if an error occurred (in which case errno is set).
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/xcm_8h_source.html b/doc/v1.9.2/xcm_8h_source.html new file mode 100644 index 000000000..eb86db458 --- /dev/null +++ b/doc/v1.9.2/xcm_8h_source.html @@ -0,0 +1,179 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020-2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_H
    +
    7#define XCM_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    1450#include <errno.h>
    +
    1451#include <stdbool.h>
    +
    1452#include <stddef.h>
    +
    1453#include <sys/types.h>
    +
    1454#include <xcm_attr_map.h>
    +
    1455
    +
    1457#define XCM_NONBLOCK (1<<0)
    +
    1458
    +
    1465struct xcm_socket;
    +
    1466
    +
    1519struct xcm_socket *xcm_connect(const char *remote_addr, int flags);
    +
    1520
    +
    1542struct xcm_socket *xcm_connect_a(const char *remote_addr,
    +
    1543 const struct xcm_attr_map *attrs);
    +
    1544
    +
    1580struct xcm_socket *xcm_server(const char *local_addr);
    +
    1581
    +
    1597struct xcm_socket *xcm_server_a(const char *local_addr,
    +
    1598 const struct xcm_attr_map *attrs);
    +
    1599
    +
    1616int xcm_close(struct xcm_socket *socket);
    +
    1617
    +
    1637void xcm_cleanup(struct xcm_socket *socket);
    +
    1638
    +
    1657struct xcm_socket *xcm_accept(struct xcm_socket *server_socket);
    +
    1658
    +
    1678struct xcm_socket *xcm_accept_a(struct xcm_socket *server_socket,
    +
    1679 const struct xcm_attr_map *attrs);
    +
    1680
    +
    1703int xcm_send(struct xcm_socket *__restrict conn_socket,
    +
    1704 const void *__restrict buf, size_t len);
    +
    1705
    +
    1729int xcm_receive(struct xcm_socket *__restrict conn_socket,
    +
    1730 void *__restrict buf, size_t capacity);
    +
    1731
    +
    1734#define XCM_SO_RECEIVABLE (1<<0)
    +
    1737#define XCM_SO_SENDABLE (1<<1)
    +
    1739#define XCM_SO_ACCEPTABLE (1<<2)
    +
    1740
    +
    1801int xcm_await(struct xcm_socket *socket, int condition);
    +
    1802
    +
    1850int xcm_fd(struct xcm_socket *socket);
    +
    1851
    +
    1897int xcm_finish(struct xcm_socket *socket);
    +
    1898
    +
    1939int xcm_set_blocking(struct xcm_socket *socket, bool should_block);
    +
    1940
    +
    1955bool xcm_is_blocking(struct xcm_socket *socket);
    +
    1956
    +
    1973const char *xcm_remote_addr(struct xcm_socket *conn_socket);
    +
    1974
    +
    1989const char *xcm_local_addr(struct xcm_socket *socket);
    +
    1990
    +
    1991#include <xcm_compat.h>
    +
    1992
    +
    1993#ifdef __cplusplus
    +
    1994}
    +
    1995#endif
    +
    1996#endif
    +
    int xcm_await(struct xcm_socket *socket, int condition)
    +
    int xcm_fd(struct xcm_socket *socket)
    +
    int xcm_receive(struct xcm_socket *__restrict conn_socket, void *__restrict buf, size_t capacity)
    +
    const char * xcm_remote_addr(struct xcm_socket *conn_socket)
    +
    struct xcm_socket * xcm_server_a(const char *local_addr, const struct xcm_attr_map *attrs)
    +
    bool xcm_is_blocking(struct xcm_socket *socket)
    +
    const char * xcm_local_addr(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept(struct xcm_socket *server_socket)
    +
    int xcm_finish(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_server(const char *local_addr)
    +
    void xcm_cleanup(struct xcm_socket *socket)
    +
    int xcm_close(struct xcm_socket *socket)
    +
    struct xcm_socket * xcm_accept_a(struct xcm_socket *server_socket, const struct xcm_attr_map *attrs)
    +
    struct xcm_socket * xcm_connect(const char *remote_addr, int flags)
    +
    int xcm_set_blocking(struct xcm_socket *socket, bool should_block)
    +
    struct xcm_socket * xcm_connect_a(const char *remote_addr, const struct xcm_attr_map *attrs)
    +
    int xcm_send(struct xcm_socket *__restrict conn_socket, const void *__restrict buf, size_t len)
    +
    This file contains the XCM attribute map API.
    +
    This file contains obsolete parts of the XCM core API.
    +
    + + + + diff --git a/doc/v1.9.2/xcm__addr_8h.html b/doc/v1.9.2/xcm__addr_8h.html new file mode 100644 index 000000000..9006455a9 --- /dev/null +++ b/doc/v1.9.2/xcm__addr_8h.html @@ -0,0 +1,1207 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_addr.h File Reference
    +
    +
    + +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses. +More...

    +
    #include <errno.h>
    +#include <inttypes.h>
    +#include <netinet/in.h>
    +#include <sys/socket.h>
    +#include <sys/types.h>
    +#include <xcm_addr_compat.h>
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  xcm_addr_ip
     
    struct  xcm_addr_host
     
    + + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_UTLS_PROTO   "utls"
     
    #define XCM_TLS_PROTO   "tls"
     
    #define XCM_TCP_PROTO   "tcp"
     
    #define XCM_SCTP_PROTO   "sctp"
     
    #define XCM_UX_PROTO   "ux"
     
    #define XCM_UXF_PROTO   "uxf"
     
    #define XCM_BTLS_PROTO   "btls"
     
    #define XCM_BTCP_PROTO   "btcp"
     
    + + + +

    +Enumerations

    enum  xcm_addr_type { xcm_addr_type_name +, xcm_addr_type_ip + }
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_addr_parse_proto (const char *addr_s, char *proto, size_t capacity)
     
    int xcm_addr_parse_utls (const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tls (const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_tcp (const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_sctp (const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_ux (const char *ux_addr_s, char *ux_path, size_t capacity)
     
    int xcm_addr_parse_uxf (const char *uxf_addr_s, char *uxf_path, size_t capacity)
     
    int xcm_addr_parse_btcp (const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_parse_btls (const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
     
    int xcm_addr_make_utls (const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
     
    int xcm_addr_make_tls (const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
     
    int xcm_addr_make_tcp (const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
     
    int xcm_addr_make_sctp (const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
     
    int xcm_addr_make_ux (const char *ux_name, char *ux_addr_s, size_t capacity)
     
    int xcm_addr_make_uxf (const char *uxf_name, char *uxf_addr_s, size_t capacity)
     
    int xcm_addr_make_btcp (const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
     
    int xcm_addr_make_btls (const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
     
    +

    Detailed Description

    +

    This is an API for building and parsing Connection-oriented Messaging (XCM) addresses.

    +
    Author
    Mattias Rönnblom
    +

    Macro Definition Documentation

    + +

    ◆ XCM_UTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_UTLS_PROTO   "utls"
    +
    +

    Protocol string for the combined TLS+UX transport.

    + +
    +
    + +

    ◆ XCM_TLS_PROTO

    + +
    +
    + + + + +
    #define XCM_TLS_PROTO   "tls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) message-oriented transport.

    + +
    +
    + +

    ◆ XCM_TCP_PROTO

    + +
    +
    + + + + +
    #define XCM_TCP_PROTO   "tcp"
    +
    +

    Protocol string for the TCP messaging transport.

    + +
    +
    + +

    ◆ XCM_SCTP_PROTO

    + +
    +
    + + + + +
    #define XCM_SCTP_PROTO   "sctp"
    +
    +

    Protocol string for the SCTP messaging transport.

    + +
    +
    + +

    ◆ XCM_UX_PROTO

    + +
    +
    + + + + +
    #define XCM_UX_PROTO   "ux"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using the abstract namespace).

    + +
    +
    + +

    ◆ XCM_UXF_PROTO

    + +
    +
    + + + + +
    #define XCM_UXF_PROTO   "uxf"
    +
    +

    Protocol string for the UNIX Domain socket (AF_UNIX SEQPACKET) messaging transport (using file system-based naming).

    + +
    +
    + +

    ◆ XCM_BTLS_PROTO

    + +
    +
    + + + + +
    #define XCM_BTLS_PROTO   "btls"
    +
    +

    Protocol string for the Transport Layer Security (TLS) byte-stream transport.

    + +
    +
    + +

    ◆ XCM_BTCP_PROTO

    + +
    +
    + + + + +
    #define XCM_BTCP_PROTO   "btcp"
    +
    +

    Protocol string for the TCP byte-stream transport.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_addr_parse_proto()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_proto (const char * addr_s,
    char * proto,
    size_t capacity 
    )
    +
    +

    Parses the protocol part of an XCM address.

    +
    Parameters
    + + + + +
    [in]addr_sThe XCM address string.
    [out]protoThe buffer where to store the protocol part of the address.
    [in]capacityThe buffer length in bytes.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 on error (in which case errno is set).
    + + + + + + + +
    errno Description
    EINVAL Malformed address.
    ENAMETOOLONG The user-supplied buffer is too small to fit the protocol.
    + +
    +
    + +

    ◆ xcm_addr_parse_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_utls (const char * utls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a UTLS XCM address.

    +
    Parameters
    + + + + +
    [in]utls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tls (const char * tls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TLS XCM address.

    +
    Parameters
    + + + + +
    [in]tls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TLS port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_tcp (const char * tcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a TCP XCM address.

    +
    Parameters
    + + + + +
    [in]tcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_sctp (const char * sctp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parse a SCTP XCM address.

    +
    Parameters
    + + + + +
    [in]sctp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe SCTP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_ux (const char * ux_addr_s,
    char * ux_path,
    size_t capacity 
    )
    +
    +

    Parses an UX (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]ux_addr_sThe string to sparse.
    [out]ux_pathThe UNIX (NUL-terminated) abstract name portion of the UX address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_uxf (const char * uxf_addr_s,
    char * uxf_path,
    size_t capacity 
    )
    +
    +

    Parses an UXF (UNIX Domain Socket) XCM address.

    +
    Parameters
    + + + + +
    [in]uxf_addr_sThe string to sparse.
    [out]uxf_pathThe UNIX (NUL-terminated) path name portion of the UXF address.
    [in]capacityThe length of the user-supplied path buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btcp (const char * btcp_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTCP XCM address.

    +
    Parameters
    + + + + +
    [in]btcp_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_parse_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_parse_btls (const char * btls_addr_s,
    struct xcm_addr_hosthost,
    uint16_t * port 
    )
    +
    +

    Parses a BTLS XCM address.

    +
    Parameters
    + + + + +
    [in]btls_addr_sThe string to sparse.
    [out]hostThe host (either DNS domain name or IPv4/v6 adress).
    [out]portThe TCP port in network byte order.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    EINVAL Malformed address.
    + +
    +
    + +

    ◆ xcm_addr_make_utls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_utls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * utls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a UTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]utls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_tcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_tcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * tcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a TCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]tcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_sctp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_sctp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * sctp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a SCTP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]sctp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_ux()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_ux (const char * ux_name,
    char * ux_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UX XCM address string from the supplied UNIX Domain Socket name.

    +
    Parameters
    + + + + +
    [in]ux_nameThe UNIX Domain Socket name.
    [out]ux_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_uxf()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_uxf (const char * uxf_name,
    char * uxf_addr_s,
    size_t capacity 
    )
    +
    +

    Builds an UXF XCM address string from the supplied file system path.

    +
    Parameters
    + + + + +
    [in]uxf_nameThe UNIX Domain path.
    [out]uxf_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid format of or too long UNIX Domain Socket address.
    + +
    +
    + +

    ◆ xcm_addr_make_btcp()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btcp (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btcp_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTCP XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btcp_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    + +

    ◆ xcm_addr_make_btls()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_addr_make_btls (const struct xcm_addr_hosthost,
    unsigned short port,
    char * btls_addr_s,
    size_t capacity 
    )
    +
    +

    Builds a BTLS XCM address string from the supplied host and port.

    +
    Parameters
    + + + + + +
    [in]hostThe host (either DNS domain name or IPv4/v6 adress).
    [in]portThe port in network byte order.
    [out]btls_addr_sThe user-supplied buffer where to store the result.
    [in]capacityThe length of the buffer.
    +
    +
    +
    Returns
    Returns 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    ENAMETOOLONG The user-supplied buffer is too small to fit the address.
    EINVAL Invalid IP address.
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/xcm__addr_8h_source.html b/doc/v1.9.2/xcm__addr_8h_source.html new file mode 100644 index 000000000..afe0ee465 --- /dev/null +++ b/doc/v1.9.2/xcm__addr_8h_source.html @@ -0,0 +1,224 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_addr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_addr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ADDR_H
    +
    7#define XCM_ADDR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    12#include <errno.h>
    +
    13#include <inttypes.h>
    +
    14#include <netinet/in.h>
    +
    15#include <sys/socket.h>
    +
    16#include <sys/types.h>
    +
    17
    +
    25#define XCM_UTLS_PROTO "utls"
    +
    28#define XCM_TLS_PROTO "tls"
    +
    30#define XCM_TCP_PROTO "tcp"
    +
    32#define XCM_SCTP_PROTO "sctp"
    +
    35#define XCM_UX_PROTO "ux"
    +
    38#define XCM_UXF_PROTO "uxf"
    +
    39
    +
    42#define XCM_BTLS_PROTO "btls"
    +
    44#define XCM_BTCP_PROTO "btcp"
    +
    45
    +
    46enum xcm_addr_type {
    +
    47 xcm_addr_type_name,
    +
    48 xcm_addr_type_ip
    +
    49};
    +
    50
    +
    + +
    53{
    +
    55 sa_family_t family;
    +
    56
    +
    58 union {
    +
    61 in_addr_t ip4;
    +
    64 uint8_t ip6[16];
    + +
    66};
    +
    +
    67
    +
    + +
    70{
    +
    72 enum xcm_addr_type type;
    +
    73
    +
    75 union {
    +
    76 struct xcm_addr_ip ip;
    +
    77 /* Max DNS name length is 253 characters */
    +
    78 char name[254];
    +
    79 };
    +
    80};
    +
    +
    81
    +
    95int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity);
    +
    96
    +
    110int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host,
    +
    111 uint16_t *port);
    +
    112
    +
    126int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host,
    +
    127 uint16_t *port);
    +
    128
    +
    143int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host,
    +
    144 uint16_t *port);
    +
    145
    +
    160int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host,
    +
    161 uint16_t *port);
    +
    162
    +
    176int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity);
    +
    177
    +
    191int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path,
    +
    192 size_t capacity);
    +
    193
    +
    207int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host,
    +
    208 uint16_t *port);
    +
    209
    +
    223int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host,
    +
    224 uint16_t *port);
    +
    225
    +
    241int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port,
    +
    242 char *utls_addr_s, size_t capacity);
    +
    243
    +
    259int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port,
    +
    260 char *tls_addr_s, size_t capacity);
    +
    261
    +
    277int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port,
    +
    278 char *tcp_addr_s, size_t capacity);
    +
    279
    +
    295int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port,
    +
    296 char *sctp_addr_s, size_t capacity);
    +
    297
    +
    312int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity);
    +
    313
    +
    328int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity);
    +
    329
    +
    345int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port,
    +
    346 char *btcp_addr_s, size_t capacity);
    +
    347
    +
    363int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port,
    +
    364 char *btls_addr_s, size_t capacity);
    +
    365
    +
    366#include <xcm_addr_compat.h>
    +
    367
    +
    368#ifdef __cplusplus
    +
    369}
    +
    370#endif
    +
    371#endif
    +
    Definition xcm_addr.h:70
    +
    enum xcm_addr_type type
    Definition xcm_addr.h:72
    +
    Definition xcm_addr.h:53
    +
    union xcm_addr_ip::@0 addr
    +
    sa_family_t family
    Definition xcm_addr.h:55
    +
    uint8_t ip6[16]
    Definition xcm_addr.h:64
    +
    in_addr_t ip4
    Definition xcm_addr.h:61
    +
    int xcm_addr_parse_uxf(const char *uxf_addr_s, char *uxf_path, size_t capacity)
    +
    int xcm_addr_make_btls(const struct xcm_addr_host *host, unsigned short port, char *btls_addr_s, size_t capacity)
    +
    int xcm_addr_make_utls(const struct xcm_addr_host *host, unsigned short port, char *utls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_sctp(const char *sctp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_ux(const char *ux_name, char *ux_addr_s, size_t capacity)
    +
    int xcm_addr_parse_utls(const char *utls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_btls(const char *btls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_tcp(const struct xcm_addr_host *host, unsigned short port, char *tcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_tls(const struct xcm_addr_host *host, unsigned short port, char *tls_addr_s, size_t capacity)
    +
    int xcm_addr_parse_ux(const char *ux_addr_s, char *ux_path, size_t capacity)
    +
    int xcm_addr_parse_btcp(const char *btcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_uxf(const char *uxf_name, char *uxf_addr_s, size_t capacity)
    +
    int xcm_addr_parse_proto(const char *addr_s, char *proto, size_t capacity)
    +
    int xcm_addr_parse_tls(const char *tls_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_parse_tcp(const char *tcp_addr_s, struct xcm_addr_host *host, uint16_t *port)
    +
    int xcm_addr_make_btcp(const struct xcm_addr_host *host, unsigned short port, char *btcp_addr_s, size_t capacity)
    +
    int xcm_addr_make_sctp(const struct xcm_addr_host *host, unsigned short port, char *sctp_addr_s, size_t capacity)
    +
    + + + + diff --git a/doc/v1.9.2/xcm__attr_8h.html b/doc/v1.9.2/xcm__attr_8h.html new file mode 100644 index 000000000..476a61761 --- /dev/null +++ b/doc/v1.9.2/xcm__attr_8h.html @@ -0,0 +1,781 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr.h File Reference
    +
    +
    + +

    This file contains the XCM attribute access API. See Socket Attributes for an overview. +More...

    +
    #include <stdbool.h>
    +#include <xcm.h>
    +#include <xcm_attr_types.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    int xcm_attr_set (struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
     
    int xcm_attr_set_bool (struct xcm_socket *socket, const char *name, bool value)
     
    int xcm_attr_set_int64 (struct xcm_socket *socket, const char *name, int64_t value)
     
    int xcm_attr_set_double (struct xcm_socket *socket, const char *name, double value)
     
    int xcm_attr_set_str (struct xcm_socket *socket, const char *name, const char *value)
     
    int xcm_attr_get (struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
     
    int xcm_attr_get_bool (struct xcm_socket *socket, const char *name, bool *value)
     
    int xcm_attr_get_int64 (struct xcm_socket *socket, const char *name, int64_t *value)
     
    int xcm_attr_get_double (struct xcm_socket *socket, const char *name, double *value)
     
    int xcm_attr_get_str (struct xcm_socket *socket, const char *name, char *value, size_t capacity)
     
    int xcm_attr_get_bin (struct xcm_socket *socket, const char *name, void *value, size_t capacity)
     
    void xcm_attr_get_all (struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute access API. See Socket Attributes for an overview.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_cb) (const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    +
    +

    The signature of the user-supplied callback used in xcm_attr_get_all().

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_set()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_type type,
    const void * value,
    size_t len 
    )
    +
    +

    Sets the value of a socket attribute.

    +

    Only attributes marked as writable may be set. For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]typeThe value type of the new value.
    [in]valueThe new value.
    [in]lenThe length of the value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is read-only.
    EINVAL The attribute name is too long, the attribute value type, value or value length is not valid for the specified attribute.
    + +
    +
    + +

    ◆ xcm_attr_set_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_bool (struct xcm_socket * socket,
    const char * name,
    bool value 
    )
    +
    +

    Sets the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new boolean value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t value 
    )
    +
    +

    Sets the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new integer value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_double (struct xcm_socket * socket,
    const char * name,
    double value 
    )
    +
    +

    Sets the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new double-precision floating point value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_set_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_set_str (struct xcm_socket * socket,
    const char * name,
    const char * value 
    )
    +
    +

    Sets the value of a string socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [in]valueThe new string value.
    +
    +
    +
    Returns
    Returns the 0 on success, or -1 if an error occured (in which case errno is set).
    +

    See xcm_attr_set() for possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get (struct xcm_socket * socket,
    const char * name,
    enum xcm_attr_typetype,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a socket attribute.

    +

    For a list of available attributes for different socket and transport types, see Generic Attributes, TCP Socket Attributes and TLS Socket Attributes.

    +

    For a description of the C types and buffer capacity requirements of the attribute types, see xcm_attr_types.h.

    +
    Parameters
    + + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]typeA pointer to a location where the type of the attribute will be stored. May be left to NULL, in case the type is known a priori.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the value on success, or -1 if an error occured (in which case errno is set).
    + + + + + + + + + +
    errno Description
    ENOENT The attribute does not exist.
    EACCES The attribute exists, but is write-only.
    EOVERFLOW The user-supplied buffer was too small to fit the value.
    + +
    +
    + +

    ◆ xcm_attr_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bool (struct xcm_socket * socket,
    const char * name,
    bool * value 
    )
    +
    +

    Retrieves the value of a boolean socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(bool) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not boolean.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_int64 (struct xcm_socket * socket,
    const char * name,
    int64_t * value 
    )
    +
    +

    Retrieves the value of an integer socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(int64_t) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not an integer.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_double (struct xcm_socket * socket,
    const char * name,
    double * value 
    )
    +
    +

    Retrieves the value of a double type socket attribute.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    +
    +
    +
    Returns
    Returns sizeof(double) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of type double.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_str (struct xcm_socket * socket,
    const char * name,
    char * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a string socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the string value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the string value (including the terminating NUL character) on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not a string.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_attr_get_bin (struct xcm_socket * socket,
    const char * name,
    void * value,
    size_t capacity 
    )
    +
    +

    Retrieves the value of a binary socket attribute.

    +
    Parameters
    + + + + + +
    [in]socketThe connection or server socket.
    [in]nameThe name of the attribute.
    [out]valueA user-supplied buffer where the value of the attribute will be stored.
    [in]capacityThe length of the buffer (in bytes).
    +
    +
    +
    Returns
    Returns the length of the binary value on success, or -1 if an error occured (in which case errno is set).
    + + + + + +
    errno Description
    ENOENT The attribute does not exist, or is not of the binary type.
    +

    See xcm_attr_get() for other possible errno values.

    + +
    +
    + +

    ◆ xcm_attr_get_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_get_all (struct xcm_socket * socket,
    xcm_attr_cb cb,
    void * cb_data 
    )
    +
    +

    Retrieves all XCM socket attributes.

    +

    This function retrieves all available attribute names, types and their current values on a particular connection or server socket.

    +

    The memory locations refered to by the attr_name and attr_value pointers is only guaranteed to be valid for the execution of the callback. If needed later, they need to be copied.

    +
    Parameters
    + + + + +
    [in]socketThe connection or server socket.
    [in]cbThe function to be called for every attribute on the socket.
    [in]cb_dataAn opaque (for XCM) pointer returned back to the application in the callback. cb_data may be NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/xcm__attr_8h_source.html b/doc/v1.9.2/xcm__attr_8h_source.html new file mode 100644 index 000000000..ae6a80f17 --- /dev/null +++ b/doc/v1.9.2/xcm__attr_8h_source.html @@ -0,0 +1,163 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_H
    +
    7#define XCM_ATTR_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    18#include <stdbool.h>
    +
    19#include <xcm.h>
    +
    20#include <xcm_attr_types.h>
    +
    21
    +
    44int xcm_attr_set(struct xcm_socket *socket, const char *name,
    +
    45 enum xcm_attr_type type, const void *value, size_t len);
    +
    46
    +
    59int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value);
    +
    60
    +
    73int xcm_attr_set_int64(struct xcm_socket *socket, const char *name,
    +
    74 int64_t value);
    +
    75
    +
    88int xcm_attr_set_double(struct xcm_socket *socket, const char *name,
    +
    89 double value);
    +
    90
    +
    103int xcm_attr_set_str(struct xcm_socket *socket, const char *name,
    +
    104 const char *value);
    +
    105
    +
    131int xcm_attr_get(struct xcm_socket *socket, const char *name,
    +
    132 enum xcm_attr_type *type, void *value, size_t capacity);
    +
    133
    +
    150int xcm_attr_get_bool(struct xcm_socket *socket, const char *name,
    +
    151 bool *value);
    +
    152
    +
    169int xcm_attr_get_int64(struct xcm_socket *socket, const char *name,
    +
    170 int64_t *value);
    +
    171
    +
    188int xcm_attr_get_double(struct xcm_socket *socket, const char *name,
    +
    189 double *value);
    +
    190
    +
    209int xcm_attr_get_str(struct xcm_socket *socket, const char *name,
    +
    210 char *value, size_t capacity);
    +
    211
    +
    229int xcm_attr_get_bin(struct xcm_socket *socket, const char *name,
    +
    230 void *value, size_t capacity);
    +
    231
    +
    233typedef void (*xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type,
    +
    234 void *value, size_t value_len, void *cb_data);
    +
    235
    +
    249void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb,
    +
    250 void *cb_data);
    +
    251
    +
    252#ifdef __cplusplus
    +
    253}
    +
    254#endif
    +
    255#endif
    +
    This file contains the core Extensible Connection-oriented Messaging (XCM) API.
    +
    int xcm_attr_set_double(struct xcm_socket *socket, const char *name, double value)
    +
    int xcm_attr_set(struct xcm_socket *socket, const char *name, enum xcm_attr_type type, const void *value, size_t len)
    +
    int xcm_attr_get_int64(struct xcm_socket *socket, const char *name, int64_t *value)
    +
    int xcm_attr_get_bin(struct xcm_socket *socket, const char *name, void *value, size_t capacity)
    +
    int xcm_attr_get_str(struct xcm_socket *socket, const char *name, char *value, size_t capacity)
    +
    int xcm_attr_set_int64(struct xcm_socket *socket, const char *name, int64_t value)
    +
    void xcm_attr_get_all(struct xcm_socket *socket, xcm_attr_cb cb, void *cb_data)
    +
    int xcm_attr_set_str(struct xcm_socket *socket, const char *name, const char *value)
    +
    int xcm_attr_set_bool(struct xcm_socket *socket, const char *name, bool value)
    +
    int xcm_attr_get(struct xcm_socket *socket, const char *name, enum xcm_attr_type *type, void *value, size_t capacity)
    +
    int xcm_attr_get_bool(struct xcm_socket *socket, const char *name, bool *value)
    +
    int xcm_attr_get_double(struct xcm_socket *socket, const char *name, double *value)
    +
    void(* xcm_attr_cb)(const char *attr_name, enum xcm_attr_type type, void *value, size_t value_len, void *cb_data)
    Definition xcm_attr.h:233
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.9.2/xcm__attr__map_8h.html b/doc/v1.9.2/xcm__attr__map_8h.html new file mode 100644 index 000000000..b43a8ef05 --- /dev/null +++ b/doc/v1.9.2/xcm__attr__map_8h.html @@ -0,0 +1,992 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_map.h File Reference
    +
    +
    + +

    This file contains the XCM attribute map API. +More...

    +
    #include <xcm_attr_types.h>
    +#include <stdbool.h>
    +#include <stddef.h>
    +#include <stdint.h>
    +
    +

    Go to the source code of this file.

    + + + + +

    +Typedefs

    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    struct xcm_attr_map * xcm_attr_map_create (void)
     
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map *original)
     
    void xcm_attr_map_add (struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_bool (struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
     
    void xcm_attr_map_add_int64 (struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
     
    void xcm_attr_map_add_double (struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
     
    void xcm_attr_map_add_str (struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
     
    void xcm_attr_map_add_bin (struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
     
    void xcm_attr_map_add_all (struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
     
    const void * xcm_attr_map_get (const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
     
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const double * xcm_attr_map_get_double (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_str (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    bool xcm_attr_map_exists (const struct xcm_attr_map *attr_map, const char *attr_name)
     
    void xcm_attr_map_del (struct xcm_attr_map *attr_map, const char *attr_name)
     
    size_t xcm_attr_map_size (const struct xcm_attr_map *attr_map)
     
    void xcm_attr_map_foreach (const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
     
    bool xcm_attr_map_equal (const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
     
    void xcm_attr_map_destroy (struct xcm_attr_map *attr_map)
     
    +

    Detailed Description

    +

    This file contains the XCM attribute map API.

    +

    An XCM attribute map is a set of key-value pairs. The key is an attribute name in the form of a string. One key maps to at most one value. The attribute value is either a boolean, a signed 64-bit integer, a double-precision floating point value, a string, or a variable-length binary object.

    +

    Typedef Documentation

    + +

    ◆ xcm_attr_map_foreach_cb

    + +
    +
    + + + + +
    typedef void(* xcm_attr_map_foreach_cb) (const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    +
    +

    Callback function prototype used for iteration.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_attr_map_create()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_create (void )
    +
    +

    Create an attribute map instance.

    +
    Returns
    An empty attribute map instance.
    + +
    +
    + +

    ◆ xcm_attr_map_clone()

    + +
    +
    + + + + + + + + +
    struct xcm_attr_map * xcm_attr_map_clone (const struct xcm_attr_map * original)
    +
    +

    Create a copy of an attribute map instance.

    +
    Parameters
    + + +
    [in]originalThe original attribute map instance, to be copied.
    +
    +
    +
    Returns
    A deep copy of the original attribute map.
    + +
    +
    + +

    ◆ xcm_attr_map_add()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add (struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_type attr_type,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a value.

    +

    This function associates the attribute key attr_name to the attribute value attr_value in the attribute map attr_map. If the key attr_name already exists, its value is replaced.

    +

    Both the key and the value will be copied, and thus attr_name and attr_value will still be owned by the caller at call completion.

    +
    Parameters
    + + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_typeThe type of the value to be added.
    [in]attr_valueThe value of the attribute to be added.
    [in]attr_value_lenThe length (in bytes) of the value.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_add_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bool (struct xcm_attr_map * attr_map,
    const char * attr_name,
    bool attr_value 
    )
    +
    +

    Associate a key with a boolean value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe boolean value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_int64 (struct xcm_attr_map * attr_map,
    const char * attr_name,
    int64_t attr_value 
    )
    +
    +

    Associate a key with a 64-bit signed integer value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe integer value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_double (struct xcm_attr_map * attr_map,
    const char * attr_name,
    double attr_value 
    )
    +
    +

    Associate a key with a double-precision floating point value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe double value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_str (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const char * attr_value 
    )
    +
    +

    Associate a key with a string value.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe string value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_bin (struct xcm_attr_map * attr_map,
    const char * attr_name,
    const void * attr_value,
    size_t attr_value_len 
    )
    +
    +

    Associate a key with a byte buffer.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be added.
    [in]attr_valueThe value of the attribute to be added.
    +
    +
    +
    See also
    xcm_attr_map_add
    + +
    +
    + +

    ◆ xcm_attr_map_add_all()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_add_all (struct xcm_attr_map * dst_map,
    const struct xcm_attr_map * src_map 
    )
    +
    +

    Copies all attributes of a map to another.

    +

    This function adds all the attributes of the source map to the target map. The source map remains unchanged.

    +
    Parameters
    + + + +
    [in]dst_mapThe attribute map to which the attributes will be added.
    [in]src_mapThe attribute map which attributes will be copied.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_get()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const void * xcm_attr_map_get (const struct xcm_attr_map * attr_map,
    const char * attr_name,
    enum xcm_attr_typeattr_type,
    size_t * attr_value_len 
    )
    +
    +

    Retrieve the value associated with a particular key.

    +

    This function retrieves the attribute value, value type and value length of the attribute attr_name, in case it exists.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    [out]attr_typeA pointer to a buffer where the value type will be stored, or NULL.
    [out]attr_value_lenA pointer to a buffer where the length (in bytes) of the value will be stored, or NULL.
    +
    +
    +
    Returns
    A pointer to the attribute value, or NULL if the attribute does not exist.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bool()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const bool * xcm_attr_map_get_bool (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the boolean value associated with a particular key.

    +

    This function retrieves the boolean attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_bool.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's boolean value, or NULL if the attribute does not exist or is of a non-boolean type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_int64()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const int64_t * xcm_attr_map_get_int64 (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the integer value associated with a particular key.

    +

    This function retrieves the 64-bit signed integer attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_int64.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's integer value, or NULL if the attribute does not exist or is of a non-integer type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_double()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const double * xcm_attr_map_get_double (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the floating point value associated with a particular key.

    +

    This function retrieves the double-precision floating point attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_double.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's double value, or NULL if the attribute does not exist or is of a non-double type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_str()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_str (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the string value associated with a particular key.

    +

    This function retrieves the NUL-terminated string attribute value of the attribute attr_name, in case it exists and is of type xcm_attr_type_str.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's string, or NULL if the attribute does not exist or is of a non-string type.
    + +
    +
    + +

    ◆ xcm_attr_map_get_bin()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    const char * xcm_attr_map_get_bin (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Retrieve the binary value associated with a particular key.

    +

    This function retrieves the attribute value, in the form of a sequence of bytes, of the attribute attr_name, in case it exists and is of type xcm_attr_type_bin.

    +

    The value pointer returned is valid as long as the key is not removed, its value is changed, or the map is destroyed.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be retrieved.
    +
    +
    +
    Returns
    A pointer to the attribute's value, or NULL if the attribute does not exist or is of a non-binary type.
    + +
    +
    + +

    ◆ xcm_attr_map_exists()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_exists (const struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Check if an attribute named attr_name exists in the attribute map.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute.
    +
    +
    +
    Returns
    true, in case the attribute name exists, and false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_del()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_del (struct xcm_attr_map * attr_map,
    const char * attr_name 
    )
    +
    +

    Removes an attribute from the attribute map.

    +

    This function deletes the attribute attr_name, in case it exists.

    +
    Parameters
    + + + +
    [in]attr_mapThe attribute map instance.
    [in]attr_nameThe name of the attribute to be deleted.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_size()

    + +
    +
    + + + + + + + + +
    size_t xcm_attr_map_size (const struct xcm_attr_map * attr_map)
    +
    +

    Returns the number of attributes in the attribute map.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance.
    +
    +
    +
    Returns
    The number of attributes in attr_map.
    + +
    +
    + +

    ◆ xcm_attr_map_foreach()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    void xcm_attr_map_foreach (const struct xcm_attr_map * attr_map,
    xcm_attr_map_foreach_cb cb,
    void * user 
    )
    +
    +

    Iterates over all attributes in a map.

    +

    This function calls the supplied callback function cb for each attribute in attr_map.

    +

    The map may not be modified during iteration.

    +
    Parameters
    + + + + +
    [in]attr_mapThe attribute map instance.
    [in]cbThe callback function.
    [in]userAn opaque pointer, supplied back to the application in every cb call.
    +
    +
    + +
    +
    + +

    ◆ xcm_attr_map_equal()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    bool xcm_attr_map_equal (const struct xcm_attr_map * attr_map_a,
    const struct xcm_attr_map * attr_map_b 
    )
    +
    +

    Compares two attribute maps for equality (by value).

    +
    Parameters
    + + + +
    [in]attr_map_aAn attribute map instance.
    [in]attr_map_bAn attribute map instance.
    +
    +
    +
    Returns
    Returns true if attr_map_a and attr_map_a are equal, false otherwise.
    + +
    +
    + +

    ◆ xcm_attr_map_destroy()

    + +
    +
    + + + + + + + + +
    void xcm_attr_map_destroy (struct xcm_attr_map * attr_map)
    +
    +

    Destroys an attribute map instance.

    +

    This function destroys the attribute map instance and frees all the resources associated with it.

    +
    Parameters
    + + +
    [in]attr_mapThe attribute map instance, or NULL.
    +
    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/xcm__attr__map_8h_source.html b/doc/v1.9.2/xcm__attr__map_8h_source.html new file mode 100644 index 000000000..b85601915 --- /dev/null +++ b/doc/v1.9.2/xcm__attr__map_8h_source.html @@ -0,0 +1,223 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_map.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_map.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2021 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_MAP_H
    +
    7#define XCM_ATTR_MAP_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    23#include <xcm_attr_types.h>
    +
    24
    +
    25#include <stdbool.h>
    +
    26#include <stddef.h>
    +
    27#include <stdint.h>
    +
    28
    +
    29struct xcm_attr_map;
    +
    30
    +
    31
    +
    37struct xcm_attr_map *xcm_attr_map_create(void);
    +
    38
    +
    39
    +
    47struct xcm_attr_map *xcm_attr_map_clone(const struct xcm_attr_map *original);
    +
    48
    +
    66void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name,
    +
    67 enum xcm_attr_type attr_type, const void *attr_value,
    +
    68 size_t attr_value_len);
    +
    69
    +
    70
    +
    80void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map,
    +
    81 const char *attr_name, bool attr_value);
    +
    82
    +
    83
    +
    93void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map,
    +
    94 const char *attr_name, int64_t attr_value);
    +
    95
    +
    96
    +
    106void xcm_attr_map_add_double(struct xcm_attr_map *attr_map,
    +
    107 const char *attr_name, double attr_value);
    +
    108
    +
    109
    +
    119void xcm_attr_map_add_str(struct xcm_attr_map *attr_map,
    +
    120 const char *attr_name, const char *attr_value);
    +
    121
    +
    122
    +
    132void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map,
    +
    133 const char *attr_name, const void *attr_value,
    +
    134 size_t attr_value_len);
    +
    135
    +
    136
    +
    146void xcm_attr_map_add_all(struct xcm_attr_map *dst_map,
    +
    147 const struct xcm_attr_map *src_map);
    +
    148
    +
    149
    +
    166const void *xcm_attr_map_get(const struct xcm_attr_map *attr_map,
    +
    167 const char *attr_name,
    +
    168 enum xcm_attr_type *attr_type,
    +
    169 size_t *attr_value_len);
    +
    170
    +
    171
    +
    186const bool *xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map,
    +
    187 const char *attr_name);
    +
    188
    +
    189
    +
    204const int64_t *xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map,
    +
    205 const char *attr_name);
    +
    206
    +
    207
    +
    222const double *xcm_attr_map_get_double(const struct xcm_attr_map *attr_map,
    +
    223 const char *attr_name);
    +
    224
    +
    225
    +
    240const char *xcm_attr_map_get_str(const struct xcm_attr_map *attr_map,
    +
    241 const char *attr_name);
    +
    242
    +
    257const char *xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map,
    +
    258 const char *attr_name);
    +
    259
    +
    268bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map,
    +
    269 const char *attr_name);
    +
    270
    +
    271
    +
    280void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name);
    +
    281
    +
    282
    +
    290size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map);
    +
    291
    +
    292
    +
    296typedef void (*xcm_attr_map_foreach_cb)(const char *attr_name,
    +
    297 enum xcm_attr_type attr_type,
    +
    298 const void *attr_value,
    +
    299 size_t attr_value_len,
    +
    300 void *user);
    +
    301
    +
    302
    +
    315void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map,
    +
    316 xcm_attr_map_foreach_cb cb, void *user);
    +
    317
    +
    318
    +
    327bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a,
    +
    328 const struct xcm_attr_map *attr_map_b);
    +
    329
    +
    338void xcm_attr_map_destroy(struct xcm_attr_map *attr_map);
    +
    339
    +
    340#ifdef __cplusplus
    +
    341}
    +
    342#endif
    +
    343#endif
    +
    const bool * xcm_attr_map_get_bool(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const double * xcm_attr_map_get_double(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const int64_t * xcm_attr_map_get_int64(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    struct xcm_attr_map * xcm_attr_map_create(void)
    +
    void xcm_attr_map_foreach(const struct xcm_attr_map *attr_map, xcm_attr_map_foreach_cb cb, void *user)
    +
    void xcm_attr_map_add(struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_add_all(struct xcm_attr_map *dst_map, const struct xcm_attr_map *src_map)
    +
    struct xcm_attr_map * xcm_attr_map_clone(const struct xcm_attr_map *original)
    +
    void xcm_attr_map_add_str(struct xcm_attr_map *attr_map, const char *attr_name, const char *attr_value)
    +
    const char * xcm_attr_map_get_bin(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_int64(struct xcm_attr_map *attr_map, const char *attr_name, int64_t attr_value)
    +
    bool xcm_attr_map_equal(const struct xcm_attr_map *attr_map_a, const struct xcm_attr_map *attr_map_b)
    +
    void xcm_attr_map_del(struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void xcm_attr_map_add_double(struct xcm_attr_map *attr_map, const char *attr_name, double attr_value)
    +
    const char * xcm_attr_map_get_str(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    void(* xcm_attr_map_foreach_cb)(const char *attr_name, enum xcm_attr_type attr_type, const void *attr_value, size_t attr_value_len, void *user)
    Definition xcm_attr_map.h:296
    +
    size_t xcm_attr_map_size(const struct xcm_attr_map *attr_map)
    +
    void xcm_attr_map_add_bool(struct xcm_attr_map *attr_map, const char *attr_name, bool attr_value)
    +
    void xcm_attr_map_add_bin(struct xcm_attr_map *attr_map, const char *attr_name, const void *attr_value, size_t attr_value_len)
    +
    void xcm_attr_map_destroy(struct xcm_attr_map *attr_map)
    +
    bool xcm_attr_map_exists(const struct xcm_attr_map *attr_map, const char *attr_name)
    +
    const void * xcm_attr_map_get(const struct xcm_attr_map *attr_map, const char *attr_name, enum xcm_attr_type *attr_type, size_t *attr_value_len)
    +
    This file contains type definitions for the XCM attribute access API.
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    + + + + diff --git a/doc/v1.9.2/xcm__attr__types_8h.html b/doc/v1.9.2/xcm__attr__types_8h.html new file mode 100644 index 000000000..a370fd797 --- /dev/null +++ b/doc/v1.9.2/xcm__attr__types_8h.html @@ -0,0 +1,136 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_attr_types.h File Reference
    +
    +
    + +

    This file contains type definitions for the XCM attribute access API. +More...

    + +

    Go to the source code of this file.

    + + + + +

    +Enumerations

    enum  xcm_attr_type {
    +  xcm_attr_type_bool = 1 +, xcm_attr_type_int64 = 2 +, xcm_attr_type_str = 3 +, xcm_attr_type_bin = 4 +,
    +  xcm_attr_type_double = 5 +
    + }
     
    +

    Detailed Description

    +

    This file contains type definitions for the XCM attribute access API.

    +

    Enumeration Type Documentation

    + +

    ◆ xcm_attr_type

    + +
    +
    + + + + +
    enum xcm_attr_type
    +
    +

    Enumeration representing the different attribute value types.

    + + + + + + +
    Enumerator
    xcm_attr_type_bool 

    Boolean type (from stdbool.h). Length is sizeof(bool).

    +
    xcm_attr_type_int64 

    64-bit signed integer type in host byte order. Length is 8 octets.

    +
    xcm_attr_type_str 

    A variable-length NUL-terminated string. Length is the actual string length (including NUL).

    +
    xcm_attr_type_bin 

    Variable-length binary data.

    +
    xcm_attr_type_double 

    Double precision floating point value.

    +
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/xcm__attr__types_8h_source.html b/doc/v1.9.2/xcm__attr__types_8h_source.html new file mode 100644 index 000000000..9e321e7ad --- /dev/null +++ b/doc/v1.9.2/xcm__attr__types_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_attr_types.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_attr_types.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_ATTR_TYPES_H
    +
    7#define XCM_ATTR_TYPES_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    + +
    31
    +
    32#ifdef __cplusplus
    +
    33}
    +
    34#endif
    +
    35#endif
    +
    xcm_attr_type
    Definition xcm_attr_types.h:18
    +
    @ xcm_attr_type_int64
    Definition xcm_attr_types.h:22
    +
    @ xcm_attr_type_double
    Definition xcm_attr_types.h:29
    +
    @ xcm_attr_type_bin
    Definition xcm_attr_types.h:27
    +
    @ xcm_attr_type_str
    Definition xcm_attr_types.h:25
    +
    @ xcm_attr_type_bool
    Definition xcm_attr_types.h:20
    +
    + + + + diff --git a/doc/v1.9.2/xcm__compat_8h.html b/doc/v1.9.2/xcm__compat_8h.html new file mode 100644 index 000000000..1d5e88f16 --- /dev/null +++ b/doc/v1.9.2/xcm__compat_8h.html @@ -0,0 +1,238 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_compat.h File Reference
    +
    +
    + +

    This file contains obsolete parts of the XCM core API. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + +

    +Macros

    #define XCM_FD_READABLE   (1<<0)
     
    #define XCM_FD_WRITABLE   (1<<1)
     
    #define XCM_FD_EXCEPTION   (1<<2)
     
    + + + +

    +Functions

    int xcm_want (struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
     
    +

    Detailed Description

    +

    This file contains obsolete parts of the XCM core API.

    +

    It should not be included directly, but rather only via <xcm.h>.

    +

    Macro Definition Documentation

    + +

    ◆ XCM_FD_READABLE

    + +
    +
    + + + + +
    #define XCM_FD_READABLE   (1<<0)
    +
    +

    Flag bit denoting a readable fd event in xcm_want().

    + +
    +
    + +

    ◆ XCM_FD_WRITABLE

    + +
    +
    + + + + +
    #define XCM_FD_WRITABLE   (1<<1)
    +
    +

    Flag bit denoting a writable fd event.

    + +
    +
    + +

    ◆ XCM_FD_EXCEPTION

    + +
    +
    + + + + +
    #define XCM_FD_EXCEPTION   (1<<2)
    +
    +

    Flag bit denoting a exception fd event.

    + +
    +
    +

    Function Documentation

    + +

    ◆ xcm_want()

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    int xcm_want (struct xcm_socket * socket,
    int condition,
    int * fds,
    int * events,
    size_t capacity 
    )
    +
    +

    Query the socket what events on which file descriptors it's waiting for.

    +

    Please note: this function is obsolete, replaced by xcm_fd() and xcm_await().

    +

    This function is only used by event-driven application and with XCM sockets in non-blocking mode. For an overview on this subject, see Event-driven Programming Support.

    +

    With xcm_want(), the application will inform the XCM socket what condition it's waiting for (i.e. what XCM operation it wants to perform), and in return the XCM socket will provide a set of file descriptors and, for each fd, information on what type of event on that fd it require to make progress. Progress can mean both progress toward the goal of reaching the application's desired socket condition, or finishing any outstanding task the XCM socket has.

    +

    In case any of the conditions the application is asking for are believed to be already met, the xcm_want() call will return 0.

    +

    In case the XCM socket has no outstanding tasks, and the application is not asking for any operation that the XCM socket believes it can't immediate fulfill, the call will return 0.

    +

    The conditions specified by the application are future operation it wishes to perform on a socket (as opposed to finishing operations the socket has already accepted). For example, if an application use xcm_send() to transmit a message, and the XCM socket accept this request (by returning 0 on the call), the application shouldn't send XCM_SO_SENDABLE flag for the reason of having XCM finishing the transmission; the task of actually handing over message to the lower layer is performed by XCM regardless of the conditions specified.

    +

    Note that XCM may ask the application to wait for the connection's fd or fds to become writable, even if the application is waiting to receive a message. It may also ask the application to wait for the connection's fd to become readable, even if the application is attemting to send a messaging.

    +

    Even though the conditions for a particular connection socket are met (fd is becoming writable, for example), there's no guarantee that the xcm_send() or xcm_receive() won't block (or in case of non-blocking mode, won't fail and set EAGAIN).

    +

    The XCM socket fds may only be used with select(). Supplying this fd to any other OS calls (such as setsockopt(2), read(2) etc) is prohibited.

    +

    The information received on which fd to use, and what events on that fd are relevant for the connection socket in its current state, are only valid until more xcm_* calls are made on this socket. See Finishing Outstanding Tasks for more information.

    +

    The fd is an positive integer, unique within this process.

    +

    The condition parameter is a bitmask, with the bits being XCM_SO_RECEIVABLE, XCM_SO_SENDABLE, and/or XCM_SO_ACCEPTABLE. If no bits are set, the application is not interested in anything beyond this XCM socket to finish any outstanding task.

    +

    Each element in the events array is an int used as a bitmask. The bitmask at position N in the events array represents the file descriptor events the XCM transport is waiting for, for fd at position N in the fds array. The bits are XCM_FD_READABLE, XCM_FD_WRITABLE and/or XCM_FD_EXCEPTION. At least one bit is always set.

    +

    If a socket is waiting for multiple events (for example, both readable and writable on the same fd, or readable on one fd, and writeable on another), the condition is met whenever any of the events occur (as oppose to all events).

    +
    Parameters
    + + + + + + +
    [in]socketThe XCM socket.
    [in]conditionThe condition the application is waiting for.
    [out]fdsAn user-supplied array to store the fds.
    [out]eventsAn user-supplied array of int to store the bitmask of each of the fds in the fds array.
    [in]capacityThe length of the fds and events arrays.
    +
    +
    +
    Returns
    Returns the number (>=0) of fds, or -1 if an error occured (in which case errno is set).
    + + + + + + + +
    errno Description
    EOVERFLOW The user-supplied buffer was too small to fit the socket's fds.
    EINVAL The socket is not in blocking mode, or the condition bits are invalid.
    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/xcm__compat_8h_source.html b/doc/v1.9.2/xcm__compat_8h_source.html new file mode 100644 index 000000000..060012d56 --- /dev/null +++ b/doc/v1.9.2/xcm__compat_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_compat.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_compat.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2020 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_COMPAT_H
    +
    7#define XCM_COMPAT_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    20#define XCM_FD_READABLE (1<<0)
    +
    22#define XCM_FD_WRITABLE (1<<1)
    +
    24#define XCM_FD_EXCEPTION (1<<2)
    +
    25
    +
    117int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events,
    +
    118 size_t capacity);
    +
    119
    +
    120#ifdef __cplusplus
    +
    121}
    +
    122#endif
    +
    123#endif
    +
    int xcm_want(struct xcm_socket *socket, int condition, int *fds, int *events, size_t capacity)
    +
    + + + + diff --git a/doc/v1.9.2/xcm__version_8h.html b/doc/v1.9.2/xcm__version_8h.html new file mode 100644 index 000000000..6aa6fa244 --- /dev/null +++ b/doc/v1.9.2/xcm__version_8h.html @@ -0,0 +1,273 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h File Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    xcm_version.h File Reference
    +
    +
    + +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + + + + + + + + +

    +Macros

    #define XCM_VERSION_MAJOR   1
     
    #define XCM_VERSION_MINOR   9
     
    #define XCM_VERSION_PATCH   2
     
    #define XCM_VERSION   "1.9.2"
     
    #define XCM_VERSION_API_MAJOR   0
     
    #define XCM_VERSION_API_MINOR   24
     
    #define XCM_VERSION_API   "0.24"
     
    + + + + + + + + + + + + + + + +

    +Functions

    unsigned int xcm_version_major (void)
     
    unsigned int xcm_version_minor (void)
     
    unsigned int xcm_version_patch (void)
     
    const char * xcm_version (void)
     
    unsigned int xcm_version_api_major (void)
     
    unsigned int xcm_version_api_minor (void)
     
    const char * xcm_version_api (void)
     
    +

    Detailed Description

    +

    This file contains functions and macros to retrieve XCM version information. The library (i.e., implementation) version uses the semver convention.

    +

    Function Documentation

    + +

    ◆ xcm_version_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_major (void )
    +
    +

    Retrieves the library major version.

    +

    This function returns the implementation major version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_minor (void )
    +
    +

    Retrieves the library minor version.

    +

    This function returns the implementation minor version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version_patch()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_patch (void )
    +
    +

    Retrieves the library patch version.

    +

    This function returns the implementation patch version of the library used at run time.

    + +
    +
    + +

    ◆ xcm_version()

    + +
    +
    + + + + + + + + +
    const char * xcm_version (void )
    +
    +

    Retrieves the library version as a string.

    +

    This function returns the version of the library used at run time, in string format.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    + +

    ◆ xcm_version_api_major()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_major (void )
    +
    +

    Retrieves the XCM API major version.

    +

    This function returns the API major version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api_minor()

    + +
    +
    + + + + + + + + +
    unsigned int xcm_version_api_minor (void )
    +
    +

    Retrieves the XCM API minor version.

    +

    This function returns the API minor version of the library used at run time adheres to.

    + +
    +
    + +

    ◆ xcm_version_api()

    + +
    +
    + + + + + + + + +
    const char * xcm_version_api (void )
    +
    +

    Retrieves the library API version as a string.

    +

    This function returns the API version of the library used at run time adheres to.

    +

    The string returned is statically allocated, and thus must not be free'd by the caller.

    + +
    +
    +
    + + + + diff --git a/doc/v1.9.2/xcm__version_8h_source.html b/doc/v1.9.2/xcm__version_8h_source.html new file mode 100644 index 000000000..b1342ace2 --- /dev/null +++ b/doc/v1.9.2/xcm__version_8h_source.html @@ -0,0 +1,140 @@ + + + + + + + +Extensible Connection-oriented Messaging (XCM): include/xcm_version.h Source File + + + + + + + + + +
    +
    + + + + + + +
    +
    Extensible Connection-oriented Messaging (XCM) +
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    xcm_version.h
    +
    +
    +Go to the documentation of this file.
    1/*
    +
    2 * SPDX-License-Identifier: BSD-3-Clause
    +
    3 * Copyright(c) 2022 Ericsson AB
    +
    4 */
    +
    5
    +
    6#ifndef XCM_VERSION_H
    +
    7#define XCM_VERSION_H
    +
    8#ifdef __cplusplus
    +
    9extern "C" {
    +
    10#endif
    +
    11
    +
    25#define XCM_VERSION_MAJOR 1
    +
    26
    +
    28#define XCM_VERSION_MINOR 9
    +
    29
    +
    31#define XCM_VERSION_PATCH 2
    +
    32
    +
    34#define XCM_VERSION "1.9.2"
    +
    35
    +
    44#define XCM_VERSION_API_MAJOR 0
    +
    45
    +
    47#define XCM_VERSION_API_MINOR 24
    +
    48
    +
    50#define XCM_VERSION_API "0.24"
    +
    51
    +
    59unsigned int xcm_version_major(void);
    +
    60
    +
    67unsigned int xcm_version_minor(void);
    +
    68
    +
    74unsigned int xcm_version_patch(void);
    +
    75
    +
    84const char *xcm_version(void);
    +
    85
    +
    91unsigned int xcm_version_api_major(void);
    +
    92
    +
    98unsigned int xcm_version_api_minor(void);
    +
    99
    +
    108const char *xcm_version_api(void);
    +
    109
    +
    110#ifdef __cplusplus
    +
    111}
    +
    112#endif
    +
    113#endif
    +
    const char * xcm_version_api(void)
    +
    unsigned int xcm_version_major(void)
    +
    unsigned int xcm_version_api_major(void)
    +
    const char * xcm_version(void)
    +
    unsigned int xcm_version_minor(void)
    +
    unsigned int xcm_version_patch(void)
    +
    unsigned int xcm_version_api_minor(void)
    +
    + + + +